Sunteți pe pagina 1din 9

11. Fiiere cu tip, operaii cu fiiere.

11.1. Fiiere cu tip.

Declararea unui fiier se realizeaz astfel : <Fiier> ::= File Of <Tip_baz> unde <Tip_baz> este tipul de baz al fiierului (tipul inregistrrilor), ca n exemplul urmtor: Type Student = Record Nr_Leg : Word; Nume : String [25]; Medie : Real End; Var F_Stud : File Of Student ; Un_Stud : Student; Pentru fiierele cu tip mai exist cteva funcii i proceduri utile, pe care le prezentm n continuare :

Funcia FileSize (F) returneaz numrul articolelor fiierului F ; Procedura Seek (F,n) poziioneaz indicatorul din fiierul F la nceputul componentei cu numrul n (poziia primei componente este 0) ;

Funcia Filepos (F) returneaz poziia curent a indicatorului n fiierul F .

82

11.2. Operaii cu fiiere.

Principalele operaii asupra fiierelor sunt :

Creere fiierul),

(generarea unui fiier, care se execut o singur dat, cnd ia fiin

Actualizare (corectarea fiierului, punerea la punct n cazul n care datele nu sunt corecte sau nu mai sunt actuale), i

Listare (etapa final de obinere a rezulatatelor, a situaiilor finale). Actualizarea fiierelor poate fi efectuat secvenial (articol dup articol)

sau direct (aleator, preciznd numrul de ordine al unui articol). n operaia de actualizare se poate efectua :

Adugarea de noi articole, Modificarea unor articole (prin modificri de cmpuri ale acestora), sau Stergerea de articole. Operaiile descrise anterior vor fi exemplificate n cele ce urmeaz prin

programe Pascal. n exemplul urmtor se dorete creerea fiierului Grupa111.Dat, cu articole de forma: Nr_Leg Word Nume String[25] Medie Real

Pentru a crea acest fiier, se citete de la tastatur cte un articol (care conine informaiile despre un student) apoi acesta se scrie n fiier.
............... ............... .................

Creere

Grupa111.Dat

83

Program Cre_Fis; Type Student = Record Nr_Leg : Word; Nume : String [25]; Medie : Real End; Var F_Stud : File Of Student; Un_Stud : Student; Function Citit(Var Un_Stud:Student):Boolean; Begin With Un_Stud Do Begin Write ( Numele st.: ); Readln (Nume); If Nume= Then Citit:=False Else Begin Citit:=True; Write ( Nr.Leg. , Medie : ); Readln(Nr_Leg,Medie) End; Begin Assign (F_Stud,Grupa111.Dat); ReWrite(F_Stud); While Citit(Un_Stud) Do Write(F_Stud,Un_Stud); Close (F_Stud) End. End End { Citeste un articol }

Urmtorul program realizeaz listarea (tiprirea articolelor) fiierului Grupa111.Dat pe ecran. Pentru a tipri acest fiier, se citete din acesta cte un articol, apoi acesta se afieaz pe ecran :

Grupa111.Dat

Listare

... .......... .... ... .......... .... ... .......... ....

84

Program Lis_Fis; Type Student = Record Nr_Leg:Word; Nume:String [25]; Medie:Real End; Var F_Stud : File Of Student; Un_Stud : Student; { Adauga (n-|s|) spatii daca |s|<n }

Function Sp(s:String; n:Byte):String; Begin While Length(s)<n Do s:=s+ ; Sp:=s End; Procedure Tipar (Un_Stud : Student); Begin End; Begin With Un_Stud Do

{ Tipareste un articol pe ecran}

Writeln (FilePos(F_Stud):3,Nr_Leg:9,Sp(Nume,26):28,Medie:7:2); { Tipareste Nr.Crt., Leg, Nume, Medie.}

Writeln (Nr.Crt. Nr.Leg.,Sp( Nume,28),Medie ); Writeln; Assign (F_Stud,Grupa111.Dat); ReSet(F_Stud); While Not Eof(F_Stud) Do Read (F_Stud,Un_Stud); Tipar(Un_Stud) Close (F_Stud); Readln End. End; Begin

{ Cap tabel }

Urmtoarele exemple sunt dedicate actualizrii fiierului Grupa111.Dat. Pentru aceasta, se citesc de la tastatur datele (care conin informaiile necesare actualizrii) conform crora se corecteaz fiierul.
............... ............... .................

Actualizare

Grupa111.Dat

Prima operaie (de actualizare a fiierului), descris n continuare este modificarea, prin care se urmrete corectarea mediei. n cazul n care se dorete ca aceast operaie s fie efectuat pentru toi studenii, secvenial, atunci se citete din fiier fiecare articol, se modific media (se introduce de la tastatur noua medie) apoi se rescrie n fiier articolul modificat.

85

Pentru c dup o citire indicatorul de fiier avanseaz la noul articol (se poziioneaz pe urmtorul articol) trebuie s readucem acest indicator (apelnd procedura Seek) la nceputul ultimului articol citit (care se afla pe pozitia p-1, iar pozitia curent p se poate afla apelnd funcia FilePos). Program Mod_Secv_Fis; Type Student=Record Nr_Leg:Word; Nume:String[25]; Medie:Real End; Var F_Stud : File Of Student; Un_Stud : Student;

Function Sp (s : String; n : Byte) : String; Begin While Length(s)<n Do s:=s+ ; Sp:=s End; { Mod. media unui student } Begin End

Procedure Modific (Var Un_Stud : Student); Begin With Un_Stud Do Write (Nr_Leg:6,Sp(Nume,26):28, Media : ); Readln(Medie) End; Begin

Writeln ( Nr.Leg.,Sp( Nume,28),Medie ); Writeln; Assign (F_Stud,Grupa111.Dat); ReSet(F_Stud); While Not Eof(F_Stud) Do Read (F_Stud,Un_Stud); Modific (Un_Stud); Seek (F_Stud,FilePos(F_Stud)-1); Write (F_Stud,Un_Stud) Close (F_Stud); Readln End. End; { repozitioneaza } { pentru a rescrie crect } Begin

Dac se dorete ca aceast operaie s nu fie efectuat pentru toi studenii, ci doar pentru civa, este mult mai eficient s se precizeze pentru fiecare student, pentru care se dorete modificarea mediei, numrul de ordine al acestuia (poziia p a articolului din cadrul fiierului (0,1,...,n-1).

86

Cunoscnd aceast poziie, se va citi articolul aflat pe poziia p ( Seek(Fis,p); Read(Fis,Art) ), se vor modifica anumite cmpuri ale articolului citit, apoi se va rescrie articolul modificat pe aceeai poziie p (Seek (Fis,p); Write (Fis,Art) ), aa cum se poate vedea n exemplul prezentat n continuare.

Program Mod_Directa_Fis; Type Student = Record ... End; Var F_Stud : File Of Student; Un_Stud : Student; Nr_Crt : Integer; Function Sp (s : String; n : Byte) : String; Begin While Length(s)<n Do s:=s+ ; Sp:=s End;

{ Access Random }

{ Nr. de ordine = 1,...,n }

Procedure Modific (Var Un_Stud : Student); Begin End; Begin Writeln ( Nr.Leg.,Sp( Nume,28),Medie ); Writeln; Assign (F_Stud,Grupa111.Dat); ReSet(F_Stud); Repeat Write ( Nr.Crt.:); Readln (Nr_Crt); If Nr_Crt>0 Then Seek (F_Stud,Nr_Crt-1); Read (F_Stud,Un_Stud); Modific (Un_Stud); Seek (F_Stud,Nr_Crt-1); Write (F_Stud,Un_Stud) Until Nr_Crt=0; Close (F_Stud) End. End; Begin {p=Nr_crt-1} With Un_Stud Do Begin Write (Nr_Leg:6,Sp(Nume,26):28, Media : ); Readln(Medie) End

87

Att pentru tergerea de articole dintr-un fiier ct i pentru adugarea de noi articole este necasar utilizarea unui fiier temporar, aa cum se poate vedea n figura urmtoare:
............... ............... .................

Grupa111.Dat

tergere / Adugare

Grupa111.Tmp

Dac se dorete tergerea aleatoare a unor articole din fiier, numrul curent al acestor articole va fi introdus de la tastatur. Aceste articole vor fi omise la copierea articolelor din fiierul iniial (Grupa111.Dat) n fiierul temporar (Grupa111.Tmp). Pentru ca fiierul actualizat s poarte acelai nume iniial, se va proceda astfel : fiierul iniial se terge (Erase(Fis_Vechi)) iar fiierul final se va redenumi (Rename(Fis_Temporar,Nume_Fiier)) aa cum se poate vedea n exemplul urmtor.

Program Stergere_Directa_Fis; Type Student = Var F, G Record ... End; : File Of Student;

{ Access Random }

Un_Stud : Student; Nr_Crt : Integer; Function Sp (s : String; n : Byte) : String; Begin End; Procedure Tipar (Var Un_Stud : Student); Begin End; With Un_Stud Do Writeln (Nr_Leg:6,Sp(Nume,26):28,Medie:7:2, Sters) While Length(s)<n Do s:=s+ ; Sp:=s

88

Begin Assign (F,Grupa111.Dat); ReSet (F); Assign (G,Grupa111.Tmp); ReWrite(G); Repeat Write ( Nr.Crt.:); Readln (Nr_Crt); If Nr_Crt>0 Then While FilePos(F)+1<Nr_Crt Do Read (F,Un_Stud); Write(G,Un_Stud) Read (F,Un_Stud); Tipar(Un_Stud) Until Nr_Crt=0; While Not Eof(F) Do Read (F,Un_Stud); Write(G,Un_Stud) Close(F); Close(G); Erase(F); Rename(G,Grupa111.Dat) End. End; Begin End End; Begin Begin

Programul pentru adugarea de noi articole n fiier este prezentat n continuare i lucreaz n felul urmtor : citete de la tastatur cte un articol pe care l adaug naintea articolului cu numrul de ordine Nr_Crt (introdus tot de la tastatur). Toate articolele pn la cel precizat se copiaz din fiierul iniial n cel temporar, apoi se scrie noul articol (citit anterior). Se citete din nou alt articol care va fi adugat i aa mai departe pn cnd nu mai sunt articole de adugat. Restul articolelor care au mai rmas n fiierul iniial se vor copia i ele n fiierul final. Aa cum s-a procedat i la Stergere, se vor depune datele obinute n fiierul iniial (apelnd Erase... i Rename...) .

89

Program Adaugare_Directa_Fis; Type Student = Record Var F, G ... End;

{ Access Random }

: File Of Student; {Un_Stud este Articolul Nou, iar } { UnStud este Articolul Vechi } {Citeste Un_Stud }

Un_Stud, UnStud:Student; Nr_Crt : Integer;

Function Citit (Var Un_Stud : Student) : Boolean; Begin With Un_Stud Do Write ( Numele st.: ); Readln (Nume); If Nume= Then Citit:=False Else Begin Citit:=True; Write ( Nr.Leg. , Medie : ); Readln(Nr_Leg,Medie) End; Begin Assign (F,Grupa111.Dat); ReSet (F); Assign (G,Grupa111.Tmp); ReWrite(G); While Citit(Un_Stud) Do Begin Write ( Nr.Crt. (,FilePos(F)+1,,..,,FileSize(F)+1,) : ); Readln (Nr_Crt); While FilePos(F)+1<Nr_Crt Do Write (G,Un_Stud) End; While Not Eof(F) Do Begin Read(F,UnStud); Write(G,UnStud) End; End. End End Begin

{ Fiier Initial } { Fiierul temporar }

{ Citeste pozitia inaintea careia } Begin { se adauga noul articol } { Copiaza vechile articole } { Scrie Noul Articol }

Read(F,UnStud); Write(G,UnStud) End;

{ Copiaza restul articolelor }

Close(F); Close(G); Erase(F); Rename(G,Grupa111.Dat) { Reface fiierul }

90

S-ar putea să vă placă și