Sunteți pe pagina 1din 25

Tipuri de date structurate

Fișier
Noțiuni generale
• 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 printr-o declarație de forma:
<Tip fișier>::=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
• Type Fisiernumere = Prenume: string;
file of integer; NotaMedie: real;
Var FN: FisierNumere; end;
n: integer; FisierElevi = file of Elev;
• Type FisierCaractere = Var FE: FisierElevi
file of char; E: Elev;
Var FC: FisierCaractere; • Var f: file of integer;
c: char; • Var f: text;
• Type elev = record
Nume: string;
Asocierea fișierului
Înainte de a fi utilizată, o variabilă fișier trebuie asociată cu un fișier extern.
În pascal asocierea se face prin includerea variabilelor de tip fișier ca
argument în antetul programului cu ajutorul procedurii assign(f,s);
Unde s este o expresie de tip string care specifică calea către fișierul extern.
• assign(FN,’A:\REZULTAT\R.DAT’);
Fișierul FN se asociază cu fișierul extern R.DAT.
Operații asupra unui fișier
Pentru a putea lucra cu fișierul el trebuie deschis, aceasta se face cu
ajutorul procedurilor:
• 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.
După prelucrarea componentelor fișierul trebuie închis cu ajutorul
procedurii close(f).
• 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.
Ordinea apelurilor procedurilor prelucrării
datelor
1) assign(f,s)– asocierea fișierului pascal f cu fișierul extern s.
2) reset (f)/rewrite(f)– deschiderea fișierului pentru
citire/scriere.
3) read(f,v)/write(f,e)– citirea/scrierea unei componente în
fișierul f.
4) close(f)– închiderea fișierului f.
Exemplu
Program p1; Program p1;
{ scrierea datelor in fisier } { citirea datelor din fisier }
type numFile = file of integer; type numFile = file of integer;
var f: numFile; var f: numFile;
n: integer; n: integer;
begin begin
assign(f,'file.txt'); {asociem variabila assign(f,'file.txt'); {asociem
fisier f cu fisierul extern file.txt}
variabila fisier f cu fisierul extern
rewrite(f); {deschidem fisierul pentru
file.txt}
scriere}
reset(f); {deschidem fisierul pentru
n:=2;
citire}
write(f,1); {scriem in fisierul f
read(f,n); {citim din fisierul f prima
valoarea 1}
valoare si o inscriem in variabila n}
write(f,n); {scriem in fisierul f
valoarea variabilei n} write(n); {afisam la consola valoarea
close(f); citita din fisier}
end. close(f);
end.
Clasificarea fișierelor
• După tipul operațiilor permise asupra componentelor, fișierele se clasifică
în:
1. Fișiere de intrare (este permisă numai citirea);
2. Fișiere de ieșire (este permisă numai scrierea);
3. Fișiere de actualizare (sunt permise și scrierea și citirea).
• După modul de acces la componente, fișierele se clasifică în:
1. Fisiere cu acces secvențial sau secvențiale (accesul la componenta i este
permis după ce s-a citit/scris componenta i-1)
2. Fișiere cu acces aleator sau direct (orice componentă se poate referi direct
prin numărul ei de ordine i în fișier)
Fișiere secvențiale
Pentru a declara un fișier secvențial se folosește forma file of. Deschiderea
unui fişier secvenţial pentru înscriere se face cu ajutorul procedurii rewrite(f)
• Înscrierea componentei cu ajutorul procedurii write(f,e) sau write(f,e1,e2,e3…)
unde e este o expresie de tipul componentei fișierului. După înscrierea
ultimei componente fișierul trebuie închis cu ajutorul procedurii close(f).
• Pentru a citi informația dintr-un fișier secvențial se apelează procedura
reset(f). Componenta curentă se citește cu procedura read(f,v) sau
read(f,v1,v2,v3…). Sfîrșitul fișierului este semnalat de funcția eof(f) care
întoarce true după citirea ultimei componente.
Fișiere cu acces direct
• Variabilele de tip file of permit atît citiri, cît și scrieri, indiferent dacă ele au fost
deschise cu rewrite sau reset.
• Pentru aceasta fiecare componentă a fișierului are asociat un număr de ordine
(prima – 0, a doua – 1 ș.a.m.d.). Numărul de componente poate fi determinat cu
ajutorul funcției FileSize(f).
• În mod normal accesul la componente este secvențial ce înseamnă că după
prelucrarea componentei i poziția curentă în fișier se deplasează la componenta
i+1.
• Accesul direct se bazează pe procedura de căutare Seek(f,i) care mută poziția
curentă în fișierul f pe componenta i.
• Pentru a determina poziția curentă în fișier se folosește funcția FilePos(f,i).
Exemplu
Program p1; este ',compNr,'.');
type numFile = file of integer; { afisam toate valorile din fisier si
var f: numFile; pozitiile acestora }
n, i, compNr, pos, posValue: integer; while not eof(f) do begin
begin write('Pozitia: ',filepos(f),' -
valoarea: ');
{ cream un fisier cu 10 valori numerice }
read(f,n);
assign(f,'file.txt');
write(n:2,'. '#13#10);
rewrite(f);
end;
for i:=1 to 10 do
{ cautam si afisam o componenta de pe o
write(f,i); pozitie specificata }
close(f); writeln('Care componenta o afisam? ');
{ deschidem fisierul pentru citirea datelor readln(pos);
}
seek(f,pos);
assign(f,'file.txt');
read(f,posValue);
reset(f);
writeln('Pe pozitia ',pos,' este inscrisa
{ afisam numarul de componente din valoarea ',posValue,'.');
fisier }
close(f);
compNr:=filesize(f);
end.
writeln('Numarul de componente in fisier
Fișiere TEXT
Un fișier text este format dintr-o secvență de caractere divizată în linii,
lungimea liniilor este variabilă. Sfârșitul fiecărei linii este indicat de un
element special notat EOL(end of line). Întrucât lungimea liniilor este
variabilă, poziția unei linii nu poate fi calculată din timp, deci accesul la
aceste fișiere este secvențial.
• Declarația: var f:text;
Tipul predefinit text este cunoscut oricărui program Pascal. Subliniez
faptul că tipurile text și file of char sunt distincte, deoarece file of nu
include elementele EOL.
Fișierele text în afară de funcțiile read, write mai au funcții speciale care
prelucrează elementele EOL.
• Writeln(f) – înscrie în fișier elementul EOL
• Readln(f) – trece la linia următoare
Sfârșitul de linie este semnalat de funcția booleană eoln(f) care ia
valoarea true după citirea ultimului caracter din linie.
Funcții și proceduri standart pentru lucru cu
fișiere
• Procedura Assign(f,nume) asociază fişierul extern nume variabilei de tip fişier
f.
• Procedura Rewrite(f) pregăteşte pentru (re)scriere fişierul f înlocuindu-l cu un
fişier vid (care nu conţine nici o componentă).
• Procedura Write(f,x) adaugă în fişierul f o componentă, şi anume, valoarea
returnată de expresia x. Evident, x trebuie să aibă tipul compatibil cu tipul
componentelor lui f.
• Procedura Reset(f) pregăteşte fişierul f pentru citire, mutând poziţia de citire la
începutul fişierului.
• Procedura Read(f,v) atribuie următoarea componentă a fişierului f variabilei v,
după care avansează poziţia de citire dincolo de această componentă.
• Funcţia Eof(f) retumează valoarea true, dacă poziţia de citire în f este sfîrşit de
fişier, în caz contrar - valoarea false.
• Procedura Close(f) închide fişierul f.
• Funcţia FilePos(f) retumează o valoare de tip longint, care reprezintă numărul de
ordine al componentei curente din fişierul cu acces direct f.
• Funcţia FileSize(f) returnează o valoare de tip longint, care reprezintă numărul
total de componente ale fişierului cu acces direct f.
• Procedura Seek(f, i) mută poziţia de citire/scriere pe componenta cu numărul de
ordine i din fişierul cu acces direct f.
• Funcţia Eoln(f) returnează valoarea true, dacă s-a ajuns la sfârşit de linie într-un
fişier text.
Notă: Funcţiile FileSize, FilePos şi procedura Seek se utilizează doar în fişiere cu
acces direct (tipizate).
Fișiere text
Program P;
{Crearea fisierului text FILE.TXT si inscrierea in el a
caracterelor introduse de la tastatura}
var F : text;
c : char;
begin FILE.TXT:
a
assign(F, 'FILE.TXT');
b
rewrite(F); c
repeat d
read(c); e
write(F,c); f
until c=' ';
close(F);
end.
FILE.TXT:
Fișiere text a
b
Program P;
c
{Citirea fisierului text FILE.TXT}
d
var F : text;
e
c : char; f
begin Output:
assign(F, 'FILE.TXT'); { asociaza F cu FILE.TXT } a
reset(F); { deschide F pentru citire } b
while not eof(F) do c
d
begin
e
while not eoln(F) do f
begin
readln(F, c); { citeste valoarea din F, o inscrie in variabila c si trece la
urmatoarea linie din F }
writeln(c); { afiseaza valoarea lui c in Output si trece la urmatoarea linie}
end;
end;
close(F); { inchide F }
readln;
end.
Se dă fişierul text numere.txt care conţine pe primul rând o valoare
naturală nenulă n (n<=30000) şi pe al doilea rând n valori întregi de cel
mult 4 cifre separate prin unul sau mai multe spaţii. Se cere să se
calculeze suma elementelor pare de pe al doilea rând din fişier.
Program p;
var f:text;
n,i,s,x:integer;
begin
assign(f,'numere.txt'); numere.txt:
9
reset(f); 123456789
readln(f,n); Output:
Suma componentelor pare: 20
s:=0;
for i:=1 to n do begin
read(f,x);
if x mod 2=0 then s:=s+x;
end;
writeln('Suma componentelor pare: ',s);
close(f);
end.
Se dă fişierul text numere.txt care conţine pe primul rând o valoare
naturală nenulă n (n<=30000) şi pe următoarele n rânduri n valori
întregi de cel mult 4 cifre, câte o valoare pe un rând. Se cere să se
calculeze şi să se afişeze media aritmetică a elementelor pozitive dintre
cele n valori din fişier.
Program p;
numere.txt:
var f:text; 9
n,i,s,x,nr:integer; 1
begin 2
3
assign(f,'numere.txt'); 4
reset(f); -1
readln(f,n); 6
7
s:=0; nr:=0;
-3
for i:=1 to n do begin -2
readln(f,x); Output:
Media aritmetica este: 3.83
if x>0 then begin
s:=s+x;
nr:=nr+1;
end;
end;
if nr<>0 then writeln('Media aritmetica este: ',s/nr:2:2)
else writeln('Nu exista valori pozitive in fisier');
close(f);
end.
Se citeşte de la tastatură o valoare naturală nenulă n (n<=30000), apoi n
valori întregi de cel mult 4 cifre. Se cere să se afişeze în fişierul date.out
valorile impare. Valorile se vor scrie pe un singur rând separate printr-
un spaţiu.
Program p; Consola:
n=5
var f:text; x=1
x=2
n,i,x:integer; x=3
begin x=4
x=5
assign(f,'date.out'); date.out:
135
rewrite(f);
write('n='); readln(n);
for i:=1 to n do begin
write('x='); readln(x);
if x mod 2=1 then write(f,x,' ');
end;
close(f);
end.
Probleme pentru acasă
1) Se dă un șir de numere întregi. Să se efectueze următoarele operații:
a)Suma elementelor negative;
b)Produsul elementelor impare;
c)Numărul elementelor nule;
d)Numărul elementelor negative.
Intrare: fișierul 1.in organizat astfel: prima linie a fișierului conține un număr
pozitiv întreg (numărul de elemente), pe a doua linie sunt elementele numere
întregi, separate prin un singur spațiu.
Ieșire: fișierul 1.out conține pe fiecare linie rezultatul la fiecare condiție.
2) Să se creeze un fișier text care va conține toate literele, mari și mici, ale
alfabetului latin, câte două în rând: litera mică, apoi cea mare.
3) Să se creeze un fișier text care va conține toate numerele naturale de la 1 la 999
(în ordine crescătoare), câte 3 în fiecare rând.
4) Să se creeze un fișier text, în care:
• primul rând reprezintă 10 cifre de ”0”,
• rândul 2 – 10 cifre de ”1”,
• rândul 3 – 10 cifre de ”2”,
• …,
• rândul 10 – 10 cifre de ”9”.
5) Să se creeze un fișier text din 26 de rânduri, în care:
• primul rând reprezintă 10 litere de ”A”,
• rândul 2 – 10 litere de ”B”,
• rândul 3 – 10 litere de ”C”….
6) Să se creeze un fișier text din 20 de rânduri, în care:
• primul rând reprezintă 10 cifre de ”0”,
• rândul 2 – 10 litere de ”a”,
• rândul 3 – 10 cifre de ”1”,
• rândul 4 – 10 litere de ”b”,
• …,
• rândul 19 – 10 cifre de ”9”,
• rândul 20 – 10 litere de ”j”.

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