1.5. GENERALITĂȚI DESPRE FIȘIERE
Prin fişier se înţelege o structură de date care constă dintr-o secvenţă de componente. Fiecare componentă din secvenţă are acelaşi tip, denumit tip de bază. Numărul componentelor din secvenţă nu este fixat, însă sfîrşitul secvenţei este indicat de un simbol special, notat EOF(End of File - sfîrşit de fişier). Fişierul care nu conţine nici o componentă se numeşte fişier vid.
Un tip de date fişier se defineşte printro declaraţie de forma:
<Tip fişier> ::= [packed] file of <Tip>;
unde <Tip> este tipul de bază. Tipul de bază este un tip arbitrar, exceptînd tipul fişier (nu există “fişier de fişiere”).
Exemple:
1) type FisierNumere = file of integer;
var FN : FisierNumere;
n : integer;
2) type FisierCaractere = file of char;
var FC : FisierCaractere;
c : char;
3) type Elev = record
Nume : string;
Prenume : string;
NotaMedie : real ;
end;
FisierElevi = file of Elev;
var FE : FisierElevi;
E : Elev;
Variabilele FN, FC, FE ş.a. de tip fişier se numesc fişiere logice, fişiere PASCAL sau, pur şi simplu, fişiere. Spre deosebire de celelalte tipuri de date, valorile cărora se păstrează în memoria internă a calculatorului, datele fişierelor PASCAL se păstrează pe suporturile de informaţie ale echipamentelor periferice.
Informaţia pe suporturile în studiu este organizată în formă de fişiere externe în conformitate cu cerinţele sistemului de operare. Prin urmare, înainte de a fi utilizată, o variabilă fişier trebuie asociată cu un fişier extern. Metodele de asociere sînt specifice implementării limbajului şi sistemului de operare al calculatorului-gazdă.
In limbajul-standard asocierea se realizează prin includerea variabilelor de tip fişier ca argumente în antetul de program.
In Turbo PASCAL asocierea unei variabile de tip fişier f cu un fişier extern se realizează prin apelul de procedură
Assign(f,s);
unde s este o expresie de tip string care specifică calea de acces şi numele fişierului extern.
Exemple:
1) assign (FN, 'A:\REZULTAT\R.DAT');
- fişierul FN se asociază cu fişierul extern R. DAT din directorul REZULTAT de pe discul A.
2) assign(FC, 'C:\A.CHR')
- fişierul FC se asociază cu fişierul A. CHR din directorul-rădăcină al discului C.
3) write (' Dati un nume de fişier:' };
readln(str);
assign(FE, str);
- fişierul FE se asociază cu un fişier extern numele căruia este citit de la tastatură şi depus în variabila de tip string str.
După executarea instrucţiunii assign (f, 8) toate operaţiile referitoare la fişierul PASCAL / se vor efectua asupra fişierului extern s.
Cele mai uzuale operaţii asupra unui fişier sînt citirea şi scrierea unei componente.
Citirea unei componente se realizează printr-un apel de forma
Read(f,v);
unde v este o variabilă declarată cu tipul de bază al fişierului f.
Scrierea unei componente se realizează printr-un apel de forma:
Write(f, e);
unde e este o expresie asociată cu tipul de bază al fişierului f .
Exemple:
1) Read(FN, n);
2)write(FC, c);
3)read (FE, E).
După tipul operaţiilor permise asupra componentelor, fişierele se clasifică în:
- fişiere de intrare (este permisă numai citirea);
- fişiere de ieşire (este permisг numai scrierea);
- fişiere de actualizare (sint permise atît scrierea, cit şi citirea).
După modul de acces la componente, fişierele se clasifică în:
- fişiere cu acces secvenţial sau secvenţiale (accesul la componenta i este permis după ce s-a citit/scris componenta i — 1);
- fişiere cu acces aleatoriu sau direct (orice componentă se poate referi direct prin numărul ei de ordine i în fişier).
Menţionăm că în limbajul-standard sînt permise numai fişiere secvenţiale de intrare sau ieşire.
Tipul fişierului (de intrare, ieşire sau de actualizare) şi modul de acces (secvenţial sau direct) se stabilesc printr-o operaţie de validare, numită deschidere a fişierului. Pentru aceasta, în limbajul-standard se utilizează următoarele proceduri:
reset (f) — pregăteєte un fişier existent pentru citire;
rewrite (f) — creează un fişier vid şi оl pregăteşte pentru scriere.
Cînd prelucrarea componentelor se termină, fişierul trebuie închis. La închiderea unui fişier sistemul de operare înscrie elementul EOF, înregistrează fişierul extern nou-creat în directorul respectiv ş.a.m.d.
În limbajul-standard se consideră că fişierele vor fi închise implicit la terminarea execuţiei programului respectiv. In Turbo PASCAL fişierul f ce închide prin apelul de procedură close(f).
În concluzie, prezentăm ordinea în care trebuie apelate procedurile destinate prelucrării datelor de tip fişier:
assign (f,s) — asocierea fişierului PASCAL f cu fişierul extern s;
reset (f) /rewrite (f) — deschiderea fişierului f pentru citire/scriere;
read (f, v) /write (f, e) — citirea/scrierea unei componente a fişierului f;
close ( f) —închiderea fişierului f .
După închiderea fişierului, variabila f poate fi asociată cu un alt fişier extern.
Întrucît valorile variabilelor de tip fişier se păstrează pe suporturile externe de informaţie, în PASCAL atribuirile de fişiere sînt interzise.