Lucrul Cu Fisiere in Visual Basic

15
4.11. COMENZI PENTRU LUCRUL CU FIŞIERE Fişierele conţin colecţii de date omogene ca natură şi criterii de prelucrare, memorate pe discul magnetic. Fişierele stochează pentru folosire ulterioară date numerice, texte, imagini, etc. Fişierele reprezintă principala formă de organizare a datelor pe disc. Atât programele scrise de noi, scrise într-un limbaj de programare dorit, cât şi colecţiile de date necesare funcţionării acestor programe sunt exemple de fişiere. Accesul la datele unui fişier poate fi: - Binary - caz în care programatorul trebuie să localizeze în fişier numărul de caractere ce urmează a fi citite sau scrise – un mod de acces mai puţin utilizat. - Secvenţial - situaţie în care pentru a ajunge la o anumită înregistrare din fişier, trebuie parcurse una după alta toate înregistrările fişierului (până când se ajunge la cea dorită); - Aleator – când e permis un acces direct la înregistrarea căutată, fără a fi necesară citirea înregistrărilor precedente. 4.11.1. Deschiderea fişierului Deschiderea fişierului – este o operaţie care trebuie executată înainte de orice prelucrare a acestuia. Pentru operaţii de intrare sau ieşire, orice fişier trebuie deschis cu comanda Open. Sintaxa comenzii se prezintă astfel: OPEN ( nume fişier ) FOR ( mod de deschidere ) [Access acces] [blocare] AS # numărFişier [Len=LungÎnreg] unde: - nume fişier este o expresie de tip şir de caractere ( String) care specifică numele fişierului. Acesta poate include întreaga cale: unitate de disc, director etc; - mod de deschidere – specifică modul de deschidere a fişierului prin unul din următoarele cuvinte cheie: Append (adăugare), Binary (binar), Input (citire), Output (scriere) sau Random (aleator); Dacă lipseşte, instrucţiunea Open deschide fişierul în modul de acces Random. - acces – specifică operaţiile permise asupra fişierului prin unul dintre următoarele cuvinte cheie: Read (citire), Write (scriere) sau Read- Write (citire-scriere); - blocare – specifică operaţiile permise la deschiderea fişierului de către un alt proces prin unul dintre următoarele cuvinte cheie: Shared (partajat), Lock-Read (citire interzisă), Lock-Write (scriere interzisă), lock-Read-Write.

Transcript of Lucrul Cu Fisiere in Visual Basic

Page 1: Lucrul Cu Fisiere in Visual Basic

4.11. COMENZI PENTRU LUCRUL CU FIŞIERE

Fişierele conţin colecţii de date omogene ca natură şi criterii de prelucrare, memorate pe discul magnetic. Fişierele stochează pentru folosire ulterioară date numerice, texte, imagini, etc. Fişierele reprezintă principala formă de organizare a datelor pe disc. Atât programele scrise de noi, scrise într-un limbaj de programare dorit, cât şi colecţiile de date necesare funcţionării acestor programe sunt exemple de fişiere.

Accesul la datele unui fişier poate fi:- Binary - caz în care programatorul trebuie să localizeze în fişier numărul de caractere ce urmează a fi

citite sau scrise – un mod de acces mai puţin utilizat.- Secvenţial - situaţie în care pentru a ajunge la o anumită înregistrare din fişier, trebuie parcurse una

după alta toate înregistrările fişierului (până când se ajunge la cea dorită);- Aleator – când e permis un acces direct la înregistrarea căutată, fără a fi necesară citirea înregistrărilor

precedente.

4.11.1. Deschiderea fişierului

Deschiderea fişierului – este o operaţie care trebuie executată înainte de orice prelucrare a acestuia. Pentru operaţii de intrare sau ieşire, orice fişier trebuie deschis cu comanda Open. Sintaxa comenzii se prezintă astfel:

OPEN ( nume fişier ) FOR ( mod de deschidere ) [Access acces] [blocare] AS # numărFişier [Len=LungÎnreg]unde:- nume fişier – este o expresie de tip şir de caractere (String) care specifică numele fişierului. Acesta

poate include întreaga cale: unitate de disc, director etc;- mod de deschidere – specifică modul de deschidere a fişierului prin unul din următoarele cuvinte

cheie: Append (adăugare), Binary (binar), Input (citire), Output (scriere) sau Random (aleator); Dacă lipseşte, instrucţiunea Open deschide fişierul în modul de acces Random.

- acces – specifică operaţiile permise asupra fişierului prin unul dintre următoarele cuvinte cheie: Read (citire), Write (scriere) sau Read-Write (citire-scriere);

- blocare – specifică operaţiile permise la deschiderea fişierului de către un alt proces prin unul dintre următoarele cuvinte cheie: Shared (partajat), Lock-Read (citire interzisă), Lock-Write (scriere interzisă), lock-Read-Write.

- numărFişier – un număr valid de fişier, cuprins între 1şi 511 inclusiv. Utilizând funcţia FreeFile se poate obţine următorul număr disponibil.

- LungÎnreg- un număr mai mic sau egal cu 32767 (octeţi). Pentru fişierele deschise în acces aleator această valoare este mărimea înregistrării. Pentru fişierele text reprezintă numărul de caractere transferate în buffer.

Observaţie:Instrucţiunea Open alocă o memorie tampon pentru operaţiile de intrare/ieşire (I/O) asupra

fişierului şi determină modul de accces pentru memoria tampon. Dacă fişierul specificat cu nume fişier nu există, atunci acesta va fi creat, dacă la mod de

deschidere s-a specificat Append, Binary, Output sau Random

În legătură cu aceste moduri de deschidere trebuie să reţinem următoarele:- Append – permite adăugarea de noi înregistrări în fişierul cu numele specificat sau crearea acestuia,

dacă el nu există. Practic cursorul se plasează după ultimul caracter dacă este un fişier cu acces secvenţial sau după ultima înregistrare dacă e vorba de un fişier proiectat pentru acces aleator.

Page 2: Lucrul Cu Fisiere in Visual Basic

- Binary – permite scrierea sau citirea în valori numerice. De exemplu, dacă se deschide în modul de acces Binary un fişier .bmp (imagine grafică), atunci ca efect se generează o reprezentare numerică a imaginii din fişierul respectiv.

- Input – permite doar citirea fişierului, care se va face secvenţial, de la început spre sfârşit, câte un caracter sau câte o înregistrare.

- Output – permite practic crearea fişierului, prin scrierea secvenţială în cadrul acestuia, pe rând, a câte unui caracter sau câte o înregistrare. Dacă fişierul exista şi a fost deschis Output, el va fi practic recreat, adică noul fişier se va suprascrie peste cel vechi. De aceea se recomandă multă atenţie la utilizarea acestui mod de deschidere. Pentru a scrie noi înregistrări într-un fişier existent vom deschide fişierul în modul Append.

- Random – permite fie crearea, fie citirea unui fişier în acces aleator.

Observaţie:Un fişier deschis în mod Append sau Output trebuie neapărat închis înainte de a fi deschis cu un alt

număr. Fişierele deschise în mod Binary, Input sau Random pot fi deschise cu un alt număr, fără a fi necesară închiderea lor prealabilă.

Pentru accesul secvenţial se poate specifica: APPEND – pentru a adăuga înregistrări noi la sfârşit;INPUT – pentru a citi înregistrările din fişier;OUTPUT – pentru crearea unui nou fişier.

Pentru accesul binary se specifică accesul BINARY, iar pentru cel random se specifică RANDOM. Dacă fişierul este deja deschis şi existent, la închidere şi salvare prin OUTPUT, acesta rescrie fişierele existente,.

Pentru a lucra cu mai multe fişiere simultan, se va utilize funcţia FREE FILe, care returnează următorul număr de fişiere, care poate fi utilizat în instrucţiunea OPEN.

4.11.2. Comenzi pentru fişiere aleatoare

Descrierea câmpurilor ce formează înregistrările unui fişier aleator se face utilizând o declaraţie de tip utilizator. TYPE numetip NumeVariabila1 as ...... ....... NumeVariabilak as ......END TYPE

PUBLIC nume_înregistrare As numetipAceastă declaraţie trebuie făcută pentru a fi acceptată într-un modul, cu o procedură SUB MAIN( ) (se adaugă la elementele proiectului un MODUL - Add Module din submeniul opţiunii Project – în care se declară tipul utilizator şi în mod public înregistrarea de tipul respectiv. Astfel declarată înregistrarea este accesibilă din toate componentele proiectului.

Reamintim că înregistrările dintr-un fişier pot fi uniform structurate prin intermediul unor zone ce partajează lungimea înregistrării şi care se numesc câmpuri. În acelaşi câmp din înregistrări diferite se înregistrază acelaşi tip de date, de aceeaşi lungime. Spre exemplu, într-un fişier în care sunt înregistrate date despre situaţia rezultatelor la examenele dintr-o sesiune, informaţiile din înregistrări pot avea următoarea formă:

1 Nume Prenume

An Grupa Matematică Algoritmi Arhitectură

Economie

Page 3: Lucrul Cu Fisiere in Visual Basic

2 Numpren An Gr Mate Algo Arhi Econ3 Sir Num Sir Num Num Num Num

unde în rândul: 1. s-au trecut informaţiile din înregistrare ce corespund câmpurilor;2. s-au trecut numele câmpurilor cum vor fi ele folosite în program;3. s-au trecut tipurile de date pentru fiecare câmp.

Descrierea acestei înregistrări printr-un tip utilizator poate fi făcută astfel:TYPE TIPSTUD

Numpren As stringAn As integerGr As stringMate As integerAlgo As integerArhi As integerEcon As integer

END TYPEPUBLIC studenti AS tipstud

Scrierea unei înregistrări într-un fişier aleator se face cu instrucţiunea PUT care are următoarea sintaxă:

PUT #NumeFişier, [NumărÎnreg], NumeVariabilăunde:NumărÎnreg este numărul înregistrării pe care dorim să o scriem. NumeVariabilă este numele variabilei ce defineşte înregistrarea (declarată de tipul utilizator).

Scrierea datelor în fişierele binare se asemănă cu cea în fişierele aleatoare, folosind instrucţiunea Put.

Poziţionarea pentru citire pe o înregistrare dintr-un fişier aleator se face cu instrucţiunea GET care are următoarea sintaxă:

GET [#]numărfişier [, număr]unde numărfişier este numărul de identificare al fişierului dat în instrucţiunea OPEN, iar număr este numărul de înregistrare ce se doreşte accesată.

Observaţie: La fişierele aleatoare accesul la înregistrări se poate face doar prin intermediul numărului de înregistrare.

4.11.3. Închiderea fişierelor

Închiderea fişierelor se realizează cu comanda CLOSE, a cărei sintaxă este:

CLOSE [listă fişiere] sau altfel spus CLOSE [ # numărFişier1] [, # numărFişier2] [, # numărFişier3…]

Dacă lista fişierelor ce trebuie închise lipseşte, atunci toate fişierele deschise cu Open care sunt active în mod curent vor fi închise.

Page 4: Lucrul Cu Fisiere in Visual Basic

Când se închid fişierele care au fost deschise în mod Append sau Output, toate datele aflate în zona tampon asociată fişierului vor fi scrise în fişier înaintea închiderii fişierului. Prin închiderea unui fişier cu Close asocierea dintre fişier şi numărul său dispare.       4.11.4. Comenzi pentru fişiere secvenţiale

Fişierele secvenţiale sunt în general şiruri de caractere, dar pot fi şi combinaţii de şiruri de caractere şi de numere. În general se pot folosi următoarele două instrucţiuni pentru a scrie date într-un fişier cu acces secvenţial:

a). Scrierea datelor într-un fişier secvenţial se poate face cu comenzile:

Print #NumărFişier, listă_expresiisauWrite #NumărFişier, listă_expresii

unde:listă_expresii este o listă de variabile a căror valoare urmează să fie trecută în fişier.

Pentru a scrie o înregistrare goală, după număr fişier se precizează numai virgule.Instrucţiunea WRITE # este similară cu instrucţiunea PRINT #, singura diferenţă între cele două

instrucţiuni fiind că WRITE # inserează virgule între termeni, şirurile de caractere sunt delimitate de ghilimele, iar numerele pozitive nu sunt precedate de spaţii.

Exemplu: Fiind date două liste (una de nume şi corespunzător una de vârste) să se creeze un fişier secvenţial în care să se memoreze aceste date (numele şi vârsta fiecărui student).

Rezolvare:Am proiectat forma şi am executat aplicaţia.

Codul sursă asociat evenimentului click al butonului de comandă Scrie în fişier este:

Private Sub Command1_Click()Open "d:\cezar\basic\fis1.DAT" For Output As #1Print #1, "PRIMUL TEST DE SCRIS INTR-UN FISIER"Print #1, "LA DATA DE"; Tab(20); CDate(Date)Print #1, String(35, "_")Print #1, "NUME PRENUME"; Tab(20); "VARSTA"Print #1, String(35, "_")For I = 0 To Form1.nume.ListCount - 1 Print #1, Form1.nume.List(I); Tab(20); Form1.varsta.List(I)Next IClose #1

Page 5: Lucrul Cu Fisiere in Visual Basic

End Sub

Codul asociat evenimentului click al butonului Exit:

Private Sub Command2_Click()EndEnd Sub

Verificând pe disc, fişierul fis1.dat există:

Conţinutul fişierului creat se prezintă astfel:

PRIMUL TEST DE SCRIS INTR-UN FISIERLA DATA DE 26.03.2004 ___________________________________NUME PRENUME VARSTA___________________________________stud1 17stud2 18stud3 15stud4 16stud5 18stud6 17

b) Citirea informaţiilor din fişiere cu acces secvenţial

    Citirea informaţiilor din fişierele secvenţiale se face cu ajutorul instrucţiunilor:

Input #NumărFişier, listă_expresii

Line Input# NmărFişier, ŞirCaractere

Input$ (NumărOcteţi, [#] NumărFişier)unde:ŞirCaractere este o variabilă de tip String în care este preluată înregistrarea, ca şir de caractere;NumărOcteţi reprezintă numărul de octeţi ce va fi citit din fişier.

Citirea datelor dintr-un fişier binar se realizează într-un mod asemănător cu cel aleatoriu.

4.11.5. Alte funcţii pentru lucrul cu fişiere

În lucrul cu fişierele deosebit de importante sunt o serie de funcţii.

Page 6: Lucrul Cu Fisiere in Visual Basic

Funcţia Seek(NumărFişier) returnează ca valoare poziţia curentă de citire/scriere în cadrul uni fişier deschis cu instrucţiunea Open.

Funcţia LOF(NumărFişier) returnează mărimea fişierului exprimată în octeţi. Funcţia EOF(NumărFişier) returneză valoarea logică True dacă s-a ajuns la sfârşitul unui fişier

deschis în mod aleatoriu sau secvenţial şi False în caz contrar. Aceasta înseamnă că pentru a citi toate înregistrările de date dintr-un fişier ne vom folosi de testarea valorii acestei funcţii, într-o construcţie cum ar fi:Exemplu: Să se dezvolte aplicaţia anterioară şi să se completeze astfel încât, pe lângă crearea unui fişier secvenţial, să permită noi funcţiuni şi anume:- citirea şi vizualizarea datelor din fişierul creat;- adăugarea de noi înregistrări în fişier;- modificarea conţinutului unor înregistrări (selectate de utilizator);- ştergerea unor înregistrări care nu mai sunt de actualitate (selectate de utilizator).Rezolvare:Am proiectat forma, am prevăzut pentru fiecare dintre funcţiunile aplicaţiei câte un buton de comandă şi am scris codul sursă asociat acestora:

Executând aplicaţia se obţine:

Dacă se doreşte adăugarea de noi înregistrări în fişier, atunci se precedează astfel: se activează butonul de opţiuni ADAUGARE INREGISTRĂRI ÎN FIŞIER, se completează sus, în casetele de text datele (nume, vârstă) şi, pentru preluarea lor în listă se acţionează butonul ok.

După ce am preluat în listă datele studenţilor pe care vrem să-i adăugăm în fişier, acţionîm butonul SCRIE LISTA ÎN FIŞIER.

Vom vizualiza apoi datele existente în fişier acţionând butonul LISTEAZĂ.Ca efect în lista din dreapta sunt afişate înregistrările existente acum în fişier, inclusiv cele adăugate.

Page 7: Lucrul Cu Fisiere in Visual Basic

Dacă se doreşte crearea din nou a fişierului cu elementele din listă, atunci se selectează opţiunea CREARE FIŞIER urmată de acţionarea butonului SCRIE LISTĂ ÎN FIŞIER. La acţionarea butonului LISTEAZĂ se vor vedea doar aceste înregistrări.

Se poate şterge apoi lista (din stânga) acţionând butonul CLEAR LISTA.

Dacă se doreşte modificarea unei înregistrări din listă se procedează astfel:- se apasă butonul MODIFICARE ÎNREGISTRĂRI. Ca efect se deschide o nouă formă, Form2, în

care conţinutul fişierului este trecut într-o listă. Utilizatorul selectează înregistrarea de modificat (al cărei conţinut se trece în caseta de text de deasupra listei) şi face modificările dorite.

Page 8: Lucrul Cu Fisiere in Visual Basic

Apăsând pe butonul OK MODIFICARE înregistrarea corectată trece din nou în listă şi se aşteaptă ca utilizatorul să efectueze, pe rând toate modificările dorite.

Urmează apoi preluarea în fişier a înregistrărilor din listă, deci cu corecţiile efectuate, acţionând butonul SCRIE MODIFICĂRILE ÎN FIŞIER. Se afişează din nou forma 1, cu lista fără elemente. Dacă cerem din nou o listare a fişierului (opţiunea LISTEAZĂ) se va observa că toate corecţiile noastre au fost preluate în fişier.

Pentru a şterge o înregistrare se procedează în mod similar: se apasă butonul STERGERE ÎNREGISTRĂRI , se afişează o nouă formă (FORM3) cu conţinutul fişierului afişat în listă; se alege din listă înregistrarea dorită şi ca efect ea va fi dusă în caseta de text pentru confirmare cu butonul OK STERGERE. apoi se apasă butonul RESCRIE FISIER.

Page 9: Lucrul Cu Fisiere in Visual Basic

Ca efect apare din nou forma principală, în care putem lista din nou conţinutul fişierului, pentru a ne convinge că ştergerea a fost efectuată..

Cu EXIT se iese din aplicaţie. Codul sursă asociat controalelor din cadrul aplicaţiei se prezintă astfel:

FORM1‘DeclaraţiiDim A1 As StringDim I1 As IntegerPrivate Sub Command1_Click()‘Evenimentul click al butonului “Scrie în fişier”/ Form1If Form1.Option1.Value = True Then Open "d:\cezar\basic\fis1.DAT" For Output As #1 Print #1, " TEST DE SCRIS INTR-UN FISIER" Print #1, "LA DATA DE"; Tab(20); CDate(Date) Print #1, String(35, "_") Print #1, "NUME PRENUME"; Tab(20); "VARSTA" Print #1, String(35, "_") For I = 0 To Form1.nume.ListCount - 1 Print #1, Form1.nume.List(I); Tab(20); Form1.varsta.List(I) Next I Close #1End IfIf Form1.Option2.Value = True Then Open "d:\cezar\basic\fis1.DAT" For Append As #1 For I = 0 To Form1.nume.ListCount - 1 Print #1, Form1.nume.List(I); Tab(20); Form1.varsta.List(I) Next I Close #1End If

Page 10: Lucrul Cu Fisiere in Visual Basic

End Sub

Private Sub Command2_Click()‘Evenimentul click al butonului EXITEndEnd Sub

Private Sub Command3_Click() ‘Evenimentul click al butonului “MODIFICARE INREGISTRARI” din FORM1 Form1.Hide Form2.LISTMODIF.Clear Open "d:\cezar\basic\fis1.DAT" For Input As #1 Do While Not (EOF(1)) Line Input #1, A1 Form2.LISTMODIF.AddItem (A1) Loop Close #1 Form2.ShowEnd Sub

Private Sub Command4_Click()‘Evenimentul click al butonului “OK” din FORM1If Len(Trim(Form1.Text1.Text)) > 0 Then Form1.nume.AddItem (Form1.Text1.Text) Form1.varsta.AddItem (Form1.Text2.Text) Form1.Text1.Text = "" Form1.Text2.Text = ""End IfEnd Sub

Private Sub Command5_Click()‘Evenimentul click al butonului “CLEAR LISTA” din FORM1Form1.nume.ClearForm1.varsta.ClearEnd Sub

Private Sub Command6_Click()‘Evenimentul click al butonului “LISTEAZA” din FORM1 Form1.LIST1FIS.Clear Open "d:\cezar\basic\fis1.DAT" For Input As #1 Do While Not (EOF(1)) Line Input #1, A1 Form1.LIST1FIS.AddItem (A1) Loop Close #1End Sub

Private Sub Command7_Click()‘Evenimentul click al butonului “STERGERE INREGISTRARI” din ‘FORM1 Form1.Hide Form3.LISTSTERG.Clear

Page 11: Lucrul Cu Fisiere in Visual Basic

Open "d:\cezar\basic\fis1.DAT" For Input As #1 Do While Not (EOF(1)) Line Input #1, A1 Form3.LISTSTERG.AddItem (A1) Loop Close #1 Form3.ShowEnd Sub

Form2

‘Formă pentru modificarea înregistrărilor din fişier, preluate într-o listă care apoi se trece iar în fişier, modificată‘Declaraţii la nivel de formăDim I1 As IntegerPrivate Sub Command1_Click()‘Evenimentul click al butonului “SCRIE MODIFICARILE IN FISIER” din ‘FORM2Form2.HideForm1.Show Open "d:\cezar\basic\fis1.DAT" For Output As #1 For I = 0 To Form2.LISTMODIF.ListCount - 1 Print #1, Form2.LISTMODIF.List(I) Next I Close #1End Sub

Private Sub Command2_Click()‘Evenimentul click al butonului “CANCEL” din FORM2Form1.ShowForm2.HideEnd Sub

Private Sub Command3_Click()‘Evenimentul click al butonului”OK” din FORM2If Len(Trim(Form2.Text1.Text)) > 0 Then Form2.LISTMODIF.List(I1) = Form2.Text1.Text Form2.Text1.Text = ""End IfEnd Sub

Private Sub LISTMODIF_Click()‘Evenimentul click al controlului casetă listă ”LISTMODIF” din FORM2 ‘prin care se preia în caseta text înregistrarea selectată din listăI1 = Form2.LISTMODIF.ListIndexForm2.Text1.Text = Form2.LISTMODIF.List(I1)End Sub

FORM3

‘Formă pentru ştergerea înregistrărilor din fişier, preluate într-o listă care ‘apoi se trece iar în fişier, modificată (fără înregistrările şterse)‘Declaraţii la nivel de formăDim I1 As Integer

Page 12: Lucrul Cu Fisiere in Visual Basic

Private Sub Command1_Click()‘Evenimentul click al controlului “SCRIE INREGISTRARILE IN FISIER” ‘din FORM3Form3.HideForm1