Sunteți pe pagina 1din 6

10. Fiiere Pascal. Utilizarea fiierelor text.

10.1. Fiiere Pascal.

Fiierul poate fi considerat o colecie de date stocate pe un suport extern (n general magnetic) unde pot fi pstrate atta timp ct este necesar. Un fiier este format dintr-o succesiune de elemente (nregistrri sau articole numerotate de la 0, alctuite la rndul lor din cmpuri) avnd toate acelai tip, care constituie tipul de baz al fiierului. Transferul informaiilor ntre memoria intern i cea extern (fiier) se realizeaz la nivel de articol. Pentru aceasta, n memoria intern va trebui s declaram o variabil avnd acelai tip cu tipul nregistrrilor fiierului iar prin operaiile de intrare/ieire (Read/Write) se va realiza ctitirea din, respectiv scrierea n, fiier.
Art. 0 1 2 3

Write

Memoria Articol intern

Read

Accesul la componentele unui fiier poate fi secvenial sau direct. n acces secvenial, articolele sunt prelucrate (accesate) succesiv (unul dup altul), ncepnd cu primul pan la ultimul (Art.0, Art.1,...,Art.n-1). Dac n cazul

accesului secvenial ordinea de transfer a nregistrrilor este dat de ordinea acestora n fiier, acessul direct permite transferul n orice ordine (aleator) prin precizarea numrului de ordine din cadrul fiierului (0,1,...,n-1 , dac fiierul are n articole). n vederea prelucrrii, fiierul va trebui deschis iar la terminarea operaiilor fiierul va trebui nchis. La deschiderea fiierului, indicatorul (capul de citire-scriere) este poziionat pe prima component. Indicatorul se deplaseaz automat cu o poziie spre sfrit, la fiecare operaie de scriere sau citire din fiier.

77

Deschiderea unui fiier (pregatirea lui pentru lucru) se face n doua etape. n primul rnd va trebui s precizm ce fiier se deschide (se face asocierea ntre variabila fiier i specificatorul de fiier, corespunzator fiierului dorit) utiliznd procedura Assign (Variabila_Fiier, Specificator_Fiier). Acest asociere fiind facut, de acum nainte vom utiliza doar Variabila_Fiier pentru a referi fiierul de lucru (pe care o vom nota n continuare mai simplu cu F ). Deschiderea propriuzis se va efectua prin apelul procedurii Rewrite(F) sau Reset(F) dup cum fiierul care va fi deschis urmeaz s se creeze sau s se consulte . Operaiile de intrare / ieire sunt Read(F,Art) respectiv Write(F,Art) unde am notat prin Art variabila din memoria intern (declarat n program) n , sau din care se face transferul din/n fiier. Dup terminarea operaiilor de transfer, fiierul poate fi nchis prin Close(F). O functie util n programele care lucreaz cu fiiere este funcia boolean Eof(F) care ne spune dac s-a ajuns la sfritul fiierului (dac a fost detectat marca de sfrit de fiier). n programele De

Pascal este posibil tergerea unui fiier apelnd procedura Erase(F).

asemenea, este posibil schimbarea numelui unui fiier n timpul execuiei unui program. Aceast redenumire se poate realiza prin apelul Rename(F,

Noul_Specificator_de_Fiier).

10.2. Utilizarea fiierelor text.


Coninutul unui fiier text poate fi neles ca un text dintr-o carte, organizat pe un numr de linii compuse din caractere (rnduri de tip string). ntr-un fiier text sfritul fiecrei linii este marcat prin dou caractere speciale CR (de la Carriage Return) i LF (de la Line Feed). Avantajul folosirii acestor fiiere const n faptul c ele se pot vizualiza din Norton Commander sau Turbo Pascal i chiar pot fi corectate folosind funcia de editare a acestora. Declararea unui fiier text se realizeaz simplu prin scrierea cuvntului cheie Text. De exemplu : Var f, g : Text;

78

Citirea datelor dintr-un fiier text se poate efectua prin apelul procedurii : Read (F, List_Var_Intrare); sau Readln(F, List_Var_Intrare); transferul fcndu-se din fiierul F , n aceeai manier ca i de la tastaur. Scrierea datelor ntr-un fiier text se poate efectua prin apelul procedurii : Write(F,List_Expresii_Ieire); List_Expr._Ieire); scrierea fcndu-se n fiierul F ca i pe ecran. Un prim exemplu l constituie o procedur care citete o matrice (dimensiunile i valorile acesteia) dintr-un fiier text. Considerm c aceste date sunt organizate n fiierul Matrice.Txt astfel : - primul rnd conine numrul de linii i numrul de coloane (m i n), - urmtoarele m rnduri conin valorile corespunzatoare fiecrei linii ale matricei. Procedure Cit_Mat (Var A :matrice; Var m,n : Integer); Var i, j : Integer; Begin Assign (F,Matrice.Txt); Reset (F); Readln (F,m,n); For i:=1 To m Do For j:= 1 To n Do Read (F,A[i,j]); Close (F) End; Urmtorul exemplu este un program Pascal care traduce un text aflat ntr-un fiier conform unui dicionar (care se afl stocat ntr-un fiier text avnd numele Dictio.Txt). F : Text; sau Writeln(F

79

Dicionarul este compus dintr-un ir de perechi de cuvinte de forma (St,Dr) i se construiete citind cte un rnd de forma Stnga=Dreapta din fiierul text. De exemplu, coninutul fiierului Dictio.Txt, tiprit n continuare, poate traduce un Program Pascal. Program=Algoritmul Readln=Date Read=Date Writeln=Rezultate Write=Rezultate For=Pentru Do=Executa Repeat=Repeta Until=Pana_Cand While=Cat_Timp End.=Sfarsit. ... Pentru a realiza o traducere, se citeste cte un rnd din fiierul iniial, se traduce conform dicionarului, dup care se depune (rndul tradus) n fiierul final (tradus). Traducerea unui rnd se execut astfel : se ia fiecare cuvnt din dicionar (aflat n partea stang) i se verific dac acesta se afl n rndul curent. Dac da, atunci se va nlocui n rnd cuvntul gsit cu perechea acestuia (partea dreapt din dictionar). Programul Pascal este urmtorul : Program Traducere_Text; Const Type Var Mc = 100; Sc = String[10]; Fis, Tra, Dic : Text; Rd = Record St, Dr : Sc End; Numei,Numef : String[20]; { Numarul de cuvinte din dictionar } { (St,Dr) }

Dict : Record Nrc : Byte; Cuv : Array [1..Mc] Of Rd

80

End; Rnd : String; p,i : Integer; Begin With Dict Do Begin Nrc:=0; While Not Eof(Dic) Do Begin Readln (Dic,Rnd); p:=Pos(=,Rnd); Nrc:=Nrc+1; With Cuv[Nrc] Do Begin St:=Copy(Rnd,1,p-1); Dr:=Copy(Rnd,p+1,Length(Rnd)-p) End End End; Write ( Numele fiierului de tradus : ); Readln (Numei); Write ( Numele fiierului rezultat : ); Readln (Numef); Assign(Fis, Numei); Reset (Fis); Assign(Tra, Numef); ReWrite(Tra); While Not Eof(Fis) Do Begin Readln (Fis,Rnd); With Dict Do For i:=1 To Nrc Do With Cuv[i] Do Repeat p := Pos (St,Rnd); If p>0 Then Begin Delete (Rnd,p,Length(St)); Insert (Dr,Rnd,p) End Until p = 0; Writeln(Tra,Rnd) End; { Scrie Rnd-ul tradus } { Exista cuvantul St n Rnd ? } { Inlocuieste St cu Dr } { Traduce Rnd } { Fi. de tradus } { Fi. tradus } { Deschide fiierele } { St := ... p } { Dr := p ... } { Cuv[Nrc] Dict } { un rnd din dictionar de forma St = Dr } { p memoreaza pozitia semnului = n Rnd } { ( delimiteaza partea stanga de partea drepta) } { Deschide Dictionarul } { Constr. Dictionarul n memorie n variabila Dict.}

Assign (Dic,Dictio.Txt); Reset (Dic);

81

Close (Fis); Close (Tra) End.

{ Inchide fiierele }

82

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