Documente Academic
Documente Profesional
Documente Cultură
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) ;
82
Creere fiierul),
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
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 }
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
{ Access Random }
: File Of Student; {Un_Stud este Articolul Nou, iar } { UnStud este Articolul Vechi } {Citeste Un_Stud }
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
{ Citeste pozitia inaintea careia } Begin { se adauga noul articol } { Copiaza vechile articole } { Scrie Noul Articol }
90