Informatica
Instructiuni si functii pentru lucrul cu fisiere in Visual Basic: Get, put, input, zriteFisiere Visual BasicGetCiteste date dintr-un fisier deschis si le transfera intr-o variabila. In general, datele citite cu Get au fost scrise in fisier cu instructiunea Put. Sintaxa generala: Get [#]filenumber, [recnumber], varname unde filenumber este numarul fisierului de unde se citesc date (fisierul trebuie sa fie deschis) recnumber numar optional de tip Variant (Long), ce reprezinta numarul inregistrarii (modul Random) sau numarul octetului (modul Binary) de unde incepe citirea. Prima pozitie este 1. varname numele variabilei care memoreaza informatia. Daca nu se specifica numarul inregistrarii, se va citi din pozitia activa de dupa ultima instructiune Get, Put sau Seek, iar argumentul lipsa este indicat prin virgule consecutive. Astfel, de exemplu: Get #4, , Buffer Mai trebuie precizat faptul ca aplicarea instructiunii Get trebuie sa respecte o serie de reguli, in functie de modul de acces la fisier. PutScrie valoarea unei variabile date intr-un fisier deschis in prealabil. Datele scrise cu Put sunt, in general, citite din fisier cu Get. Sintaxa generala: Put [#]filenumber, [recnumber], varname unde filenumber este numarul fisierului unde se scriu datele (fisierul trebuie sa fie deschis); recnumber numar optional Variant (Long), ce reprezinta numarul inregistrarii (modul Random) sau numarul octetului (modul Binary) unde incepe scrierea. Prima pozitie este 1. varname numele variabilei a carei valoare se scrie in fisier. Daca nu se specifica numarul inregistrarii se va scrie in pozitia activa de dupa ultima instructiune Get, Put sau Seek. Argumentul lipsa este indicat prin virgule consecutive. De exemplu: Put #4, , Buffer Ca si in cazul anterior, utilizarea acestei instructiuni trebuie sa respecte o serie de reguli, in functie de modul de acces la fisier. Input #Citeste date dintr-un fisier secvential si le transfera in variabilele specificate. Instructiunea se va utiliza doar cu fisierele deschise in modul Input sau Binary, datele citite cu Input # au fost scrise, de regula, cu Write #. Input #filenumber, varlist unde filenumber numarul fisierului (deschis in prealabil); varlist lista de variabile, separate de virgule, pentru care se citesc valorile din fisier. Nu se pot include nume de tablouri sau variabile Object, dar se accepta elemente de tablou si variabile de tipuri utilizator. Pentru situatiile uzuale (tipuri numerice sau String standarde) atribuirea valorilor se efectueaza fara modificari. Pentru alte situatii:
Mai trebuie precizat faptul ca ghilimelele duble (' ') sunt ignorate in sirul de intrare. Evident, pentru o citire corecta, datele din fisier trebuie sa apara in aceeasi ordine si trebuie sa fie de acelasi tip cu variabilele din lista. O variabila numerica primeste valoarea 0 daca intrarea corespunzatoare nu este numerica. Atingerea sfarsitului de fisier cand operatiunea de citire nu este incheiata, determina eroare. In general, se recomanda scrierea cu Write # in cazul utilizarii ulterioare a instructiunii Input #. Functia Input() Citeste si returneaza un sir de caractere citite dintr-un fisier deschis in mod Input sau Binary. Datele citite prin aceasta functie au fost scrise, de regula, prin Print # sau Put. Input(number, [#]filenumber) unde number orice expresie numerica specificand numarul de caractere care se citesc; filenumber numar de fisier (deschis). Spre deosebire de instructiunea Input #, functia Input returneaza toate caracterele citite (inclusiv virgule, CR, LF, ghilimele si spatii de inceput). Pentru fisierele deschise pentru acces Binary, incercarea de a citi prin functia Input pana cand functia EOF returneaza True, genereaza eroare (metoda este aplicabila pentru citirea din fisiere binare cu Get). Pentru detectarea sfarsitului de fisier, se vor utiliza functiile LOF and Loc. Observatie Pentru citirea datelor octet din fisiere text se va utiliza functia InputB, cu o sintaxa similara, unde, in acest caz, number specifica numarul de octeti de returnat (in loc de numarul de caractere). Line Input #Citeste o singura linie dintr-un fisier secvential (care este deschis) si atribuie sirul obtinut unei variabile de tip String. O linie este considerata terminata la intalnirea caracterului CR (Chr(13)) sau a combinatiei CR + LF (Chr(13) & Chr(10)). Caracterele CR si/sau LF nu sunt adaugate sirului atribuit. Sintaxa generala este: Line Input #filenumber, varname unde filenumber numarul atasat fisierului (deschis), varname nume de variabila de tip String sau Variant. Datele citite cu Line Input # sunt, de regula, scrise cu Print #. Write #Scrie o inregistrare intr-un fisier secvential. Datele scrise prin Write # sunt citite, de regula, cu Input #. Utilizarea instructiunii Write # asigura o delimitare corecta a fiecarui camp scris, ceea ce permite regasirea corecta (fara alte artificii) a informatiilor la citirea cu Input #. In acelasi timp, informatiile sunt regasite corect, indiferent de configurarile locale. Sintaxa este Write #filenumber, [outputlist] unde filenumber numarul atasat fisierului (deschis in prealabil), outputlist o lista de expresii numerice sau sir, separate prin virgule, spatii sau punct-virgula, ale caror valori se scriu in fisier. Specificarea unei virgule dupa filenumber fara outputlist produce o linie goala in fisier. Sunt respectate urmatoarele reguli de scriere:
Instructiunea Write # insereaza virgule intre elementele scrise in fisier, si ghilimele in jurul sirurilor de caractere (prin urmare, nu este nevoie ca utilizatorul sa introduca separatori pentru claritate). Dupa ce toate valorile au fost scrise, se insereaza automat o combinatie CR+LF, astfel incat urmatoarea scriere va fi la un rand nou. Print #Scrie intr-un fisier secvential date formatate ca pe ecran (display-formatted). Prin urmare, cu exceptiile specificate in continuare, setarile locale sunt respectate. Datele scrise cu Print # sunt, de regula, citite cu Line Input # sau cu Input. Sintaxa este Print #filenumber, [outputlist] unde filenumber numarul atasat fisierului (deschis in prealabil), outputlist lista de expresii formatate ale caror valori sunt tiparite. Elementele se separa prin virgule, spatii sau punct si virgula. Un element al listei de iesire este de forma [] [expression] [charpos] unde Spc(n) insereaza n spatii la iesire Tab(n) pozitioneaza punctul de insertie (inceputul zonei de scriere) la o coloana indicata prin valoare absoluta de n. Utilizand doar Tab, se trece la urmatoarea zona de iesire. expression expresia a carei valoare se tipareste (numerica sau String). charpos Specifica pozitia punctului de insertie pentru urmatorul caracter care va fi tiparit, potrivit tabelului care urmeaza.
Daca nu se specifica nici un specificator, urmatoarea tiparire va fi pe randul urmator. Daca se omite outputlist, dar se include un separator dupa filenumber, se va insera o linie goala in fisier. Datele logice sunt scrise drept True, False (fara traduceri locale). Datele calendaristice sunt scrise potrivit setarii locale pentru format scurt. Mai trebuie precizat ca Empty nu produce nimic, Null este scris Null, iar Error este scris ca Error errcode (fara traduceri locale). Informatiile numerice scrise respecta configurarile locale (separator zecimal). Pentru o interpretare corecta, utilizatorul trebuie sa separe valorile afisate prin formatari adecvate. Exemplu1. Sa se realizeze scrierea datelor intr-un fisier. Astfel, pentru a salva datele din tabloul strTablou intr-un fisier, se va putea utiliza urmatoarea procedura, ScrieFis, al carei argument, strNumeFis contine calea si numele fisierului de iesire. Numarul de elemente din vector este dat de variabila lNrElem Public Sub ScrieFis(strNumeFis As String) Dim lIndiceTablou As Long Open strNumeFis For Output As #1 For lIndiceTablou = 1 To lNrElem ' s-a considerat indicele primului element - 1 Print #1, strTablou(lIndiceTablou) Next lIndiceTablou Close #1 End Sub SeekStabileste pozitia (inregistrarii sau octetului) intr-un fisier unde se va efectua urmatoarea operatie de intrare/iesire, fisierul fiind deschis prin Open (vezi si functia Seek). Sintaxa este: Seek [#]filenumber, position unde filenumber numarul atasat fisierului; position numar intre
1 si 2,147,483,647, inclusiv, care indica locul urmatoarei Numerele inregistrarilor specificate in instructiunile Get si Put au prioritate in raport cu pozitia fixata prin Seek (are loc o repozitionare). Daca instructiunea Seek indica o pozitie aflata dupa sfarsitul fisierului, urmatoarea operatie de scriere (fara repozitionare) extinde fisierul. Pozitia indicata nu poate fi zero sau negativa. Functia SeekReturneaza un intreg Long, ce reprezinta pozitia curenta I/O dintr-un fisier specificat. Fisierul trebuie sa fie in prealabil deschis. Seek(filenumber) filenumber este un numar de fisier. Valoarea returnata este intre 1 si 2,147,483,647 (echivalent cu 2^31 - 1), inclusiv. Semnificatia depinde de modul de acces:
EOF Returneaza un intreg cu valoarea logica True (-1) atunci cand se atinge sfarsitul unui fisier deschis pentru citire (Random, Binary sau Input). Pentru fisierele deschise in iesire functia returneaza totdeauna True. Sintaxa generala: EOF(filenumber) filenumber este un intreg continand numarul fisierului testat. Utilizarea uzuala este Do While Not EOF(filenum) . (instructiuni, inclusiv citire din fisierul filenum) Loop Pentru acces secvential (Input) se returneaza False pana cand se atinge sfarsitul de fisier, in timp ce pentru fisierele deschise in mod Random sau Binary, se returneaza False pana cand ultima instructiune Get executata nu a putut citi inregistrare completa. Citirea cu Input dintr-un fisier deschis in mod Binary produce eroare la utilizarea procedeului general (pana cand EOF() este True): se va utiliza citirea cu Get sau citirea cu Input, impreuna cu functiile LOF sau Loc. Exemplu
De exemplu, se poate considera ca datele au fost scrise in fisier prin intermediul procedurii anterioare, ScrieFis Se considera vectorul strTablou, Public. De asemenea, se va defini o alta variabila, lNrElem, care va memora numarul de elemente din vector. Public lNrElem As Long Public strTablou(1000) As String Urmatoarea procedura poate fi utilizata pentru citirea liniilor dintr-un fisier secvential si memorarea lor intr-un vector. Public Sub CitesteFis(strNumeFis As String) Open strNumeFis For Input As #1 Do lNrElem = lNrElem + 1 If (lNrElem <= 1000) And (Not EOF(1)) Then Line Input #1, strTablou(lNrElem) End If Loop Until (EOF(1) Or lNrElem = 1000) Close #1 End Sub Argumentul strNumeFis care este transmis procedurii CitesteFis, trebuie sa indice calea si numele fisierului ce contine datele ce trebuie citite. De notat ca vor fi citite maxim 1000 linii de date, deoarece aceste este numarul de elemente pe care le poate avea vectorul strTablou (asa cum a fost definit). Eventual, se poate lucra cu tablouri dinamice, caz in care conditia de oprire din bucla de citire va contine doar verificarea sfarsitului de fisier (EOF). LocReturneaza un Long, ce reprezinta pozitia curenta de citire/scriere intr-un fisier deschis. Sintaxa generala este: Loc(filenumber) filenumber este numarul atasat fisierului. Valoarea returnata de functie depinde de modul de acces:
Functia Loc este utilizata, impreuna cu functia LOF, la testarea sfarsitului de fisier la citiri in modul de acces Binary. LOFReturneaza un Long care reprezinta, in octeti, marimea unui fisier deschis prin Open. Pentru fisierele nedeschise se poate utiliza, in acelasi scop, functia FileLen(). Sintaxa generala este: LOF(filenumber) filenumber este numarul atasat fisierului. Utilizarea acestei functii, impreuna cu functia Loc, pentru determinarea sfarsitului de fisier accesat in mod Binary se poate realiza conform urmatoarei secvente: Open filename For Binary As filenum Do While CurrentLocation < LOF(filenumber) . (citire din fisierul filenum ) CurrentLocation = Loc(filenumber) Loop Exemplu Sa se implementeze o functie care returneaza continutul unui fisier text, al carui nume este specificat ca argument al functiei. O posibila implementare este urmatoarea: Function CitesteFisText(NumeFis$) As String Dim nrFis As Integer nrFis = FreeFile Open NumeFis$ For Input As #nrFis CitesteFisText = Input$(LOF(nrFis), nrFis) Close #nrFis End Function Functia poate fi apelata, de exemplu, pentru a afisa intr-o eticheta continutul fisierului Autoexec.bat: Label1.Caption = CitesteFisText('C:AUTOEXEC.BAT') Deoarece gestionarea fisierelor nu se rezuma doar la scriere/citire, in tabelul urmator este un rezumat al principalelor operatii pe care le suporta fisierele, cu instructiunile care faciliteaza respectiva actiune.
|