Professional Documents
Culture Documents
Lucrul cu fisiere
Toate programele facute pana acum acceptau, ca sursa de date, tastatura, iar ca iesire,
monitorul. Cu toate acestea, Pascal permite folosirea fisierelor.
Sunt convins ca v-ati intrebat, cel putin o data, de ce jocurile se instaleaza cu o
multime de fisiere aditionale, in afara de executabilul propriu-zis. Raspunsul e simplu:
resursele respectivului joc se afla in acele fisiere (harti, imagini, sunete, etc).
Executabilul jocului citeste si scrie acele fisiere in functie de necesitati (scrie, de
exemplu, in fisierul de high-scores).
Sa vedem cum putem folosi si noi fisiere, in Pascal.
Pentru inceput trebuie sa stiti ca Pascal ofera trei tipuri de fisiere:
fisiere text
fisiere cu tip
fisiere fara tip
Modul de lucru (accesare, citire, scriere) difera, cel putin partial, la fiecare tip de fisier.
Sa incepem cu inceputul.
20.
for i := 1 to lins do
{#13#10 = Enter}
21.
begin
{#13
= Carriage
Return}
22.
for j := 1 to cols do
{#10
= Line
Feed}
23.
write(matrice[i,j] : 3);
24.
writeln;
25.
end;
26.
Write(#13#10'Apasati orice tasta pentru a
iesi ...'#8#8#8#8);
27.
ReadKey;
{#8 =
BackSpace}
28.
end.
Declaratia unui fisier text se face identic cu declararea unei variabile obisnuite, iar tipul variabilei este
Text..
Sa vedem ce proceduri si functii avem la dispozitie pentru lucrul cu fisiere text.
Proceduri si functii folosite la lucrul cu fisiere text
Nume
Descriere
Asigneaza un fisier (definit prin calea catre el) catre o variabila de tip fisier. Toate operatiile
ulterioare care folosesc acel fisier vor utiliza variabila acestuia. Asocierea dintre variabila si
respectivul fisier va exista pana la urmatoarea asignare a variabilei catre alt fisier.
Calea catre fisier trebuie sa fie o cale definita prin 0 sau mai multe directoare, separate prin
semnul backslash \, urmate de numele complet al fisierului. Daca aceasta cale este inceputa
direct cu semnul backslash, atunci este folosita ca si cum ar fi inceput direct in radacina (
C:\Folder\fisier.txt este identic cu \Folder\fisier.txt, daca programul este rulat dintr-un director
de pe C:. Daca este dat doar numele fisierului, atunci fisierul este cautat in directorul curent
Assign
(cel
de
unde
este
rulat
programul).
Numele fisierului trebuie sa se conformeze standardului DOS de denumire a fisierelor, adica
8.3 (nume de maxim 8 caractere, fara spatii, si extensie (optionala) de maxim 3 caractere.
Un caz special este cel in care calea catre fisier este sirul vid (adica '' - doua apostroafe, unul
dupa celalalt). In acest caz, variabila de fisier este asignata intrarii / iesirii standard. Dupa o
asignare a variabilei catre sirul vid, folosirea procedurii Reset va asocia variabila catre intrarea
standard, iar folosirea procedurii ReWrite va asocia aceasta variabila cu iesirea standard.
Restrictie:
procedura Assign nu poate fi folosita pe un fisier deja deschis.
Deschide un fisier existent pentru citire. Daca fisierul nu exista, aceasta procedura va genera o
eroare.
Dupa ce fisierul a fost deschis, pozitia in fisier (file pointer-ul) este setata la inceputul acestuia
Reset
(de
acolo
poate
incepe
citirea).
Daca variabila de fisier a fost asignata unui sir vid, dupa apelul acestei proceduri, variabila de
fisier se va referi la intrarea standard (tastatura, de obicei).
Creaza un fisier nou si il deschide pentru scriere. Daca fisierul exista, atunci el este sters si
recreat (gol). Daca variabila de fisier este asignata unui fisier deschis, acesta va inchis, sters,
recreat
si
redeschis.
Rewrite Dupa ce fisierul a fost deschis, pozitia in fisier (file pointer) este setata la inceputul acestuia.
Daca variabila de fisier a fost asignata unui sir vid, dupa apelul acestei proceduri, variabila de
fisier se va referi la iesirea standard (monitorul, de obicei).
Append Deschide fisierul ales (prin folosirea procedurii Assign) pentru scriere. Daca fisierul nu exista,
atunci aceasta procedura va genera o eroare. Daca fisierul este deja deschis, atunci el este
inchis si redeschis. Pozitia in fisier (file pointer) este setata la sfarsitul acestuia.
Daca variabila de fisier a fost asignata unui sir vid, dupa apelul acestei proceduri, variabila de
Daca ati trecut prin explicatiile date in tabelul de mai sus, ar trebui sa stiti destul de multe pentru a folosi
un fisier text fara probleme.
Sa vedem un mic program care citeste prima linie dintr-un fisier text si o adauga, inversata, la sfarsitul
fisierului.
1. uses crt;
2. var fis: Text;
3.
linie: String;
4.
i: integer;
5.
c: Char;
6. begin
7.
ClrScr;
8.
Assign(fis, 'fisier.txt');
9.
Reset(fis);
10.
11.
ReadLn(fis, linie);
12.
WriteLn('Prima linie din fisier este urmatoarea:');
13.
WriteLn(linie+#13#10);
14.
15.
WriteLn('Vom adauga linia, inversata, in fisier, la
sfarsitul acestuia.');
16.
WriteLn;
17.
18.
for i := 1 to Length(linie) div 2 do {bucla aceasta
inverseaza sirul de caractere}
19.
begin
20.
c := linie[i];
21.
linie[i] := linie[Length(linie) - i + 1];
22.
linie[Length(linie) - i + 1] := c;
23.
end;
24.
25.
Append(fis);
26.
WriteLn(fis, #13#10 + linie);
27.
Close(fis);
28.
Write(#13#10'S-a facut ! Apasati orice tasta pentru a
iesi ...');
29.
ReadKey;
30.
end.
Ultimul program care va folosi fisiere text in acest tutorial va citi date dintr-un fisier si le va salva in alt
fisier.
1. uses crt;
2. var fis: Text;
3.
linie: String;
4.
i: integer;
5.
c: Char;
6. begin
7.
ClrScr;
8.
Assign(fis, 'fisier.in');
9.
Reset(fis);
10.
11.
ReadLn(fis, linie);
12.
Close(fis);
13.
14.
WriteLn('Prima linie din fisier este urmatoarea:');
15.
WriteLn(linie+#13#10);
16.
17.
Assign(fis, 'fisier.out');
18.
Rewrite(fis);
19.
WriteLn(fis, linie);
20.
Close(fis);
21.
22.
Write(#13#10'S-a facut ! Apasati orice tasta pentru a
iesi ...');
23.
ReadKey;
24.
end.
Atentie: presupun ca este evident ca toate fisierele de intrare folosite in aceste programe vor trebui create
manual inainte de pornirea programului.
aleatorie (random) din fisier. Spre deosebire de fisierele text, de unde puteam citi doar siruri de caractere
(nu va lasati pacaliti de faptul ca ReadLn citeste si numere ... le converteste intern din string in valoare
numerica !), din fisiere fara tip se pot citi doar valori de acelasi tip ca si fisierul in sine.
Fisierele cu tip sunt, practic, o varianta a vectorilor (array, if you please). Pot stoca date de un singur tip,
cel setat in declararea variabilei de fisier, dar sunt limitate de spatiul disponibil pe hard-disk (si, in
versiunile vechi de Pascal, cum ar fi Borland Pascal, de o marime maxima de 2 GB / fisier - tineti totusi
cont ca in 1992, cand a aparut Borland Pascal 7.0 nu sunt sigur daca existau, inca, hard-disk-uri atat de
mari !).
Haideti sa vedem un mic program care scrie un set de date aleatorii intr-un fisier cu tip (tip integer, pentru
inceput), iar apoi le reciteste si afiseaza a 20-a valoare din fisier.
1. uses crt;
2. var fis: file of integer;
3.
i, val: integer;
4. begin
5.
ClrScr;
6.
Randomize;
7.
Assign(fis, 'fisier.bin');
8.
Rewrite(fis);
9.
10.
for i := 1 to 100 do
11.
begin
12.
val := Random(20000) + 1; {valori intre 1 si 20000}
13.
Write(fis, val);
14.
end;
15.
Close(fis);
16.
17.
Assign(fis, 'fisier.bin');
18.
ReSet(fis);
19.
Seek(fis, 19); {indexul incepe de la 0}
20.
21.
Read(fis, i);
22.
WriteLn('A 20-a valoare din fisier este : ',i);
23.
24.
Close(fis);
25.
26.
Write(#13#10'S-a facut ! Apasati orice tasta pentru a
iesi ...');
27.
ReadKey;
28.
end.
Este de remarcat faptul ca fiecare element din fisier ocupa 2 bytes, in acest caz (integer).
Lista de proceduri si functii care pot fi folosite la manipularea fisierelor cu tip sunt date in tabelul
de mai jos. Explicatiile date in acest tabel sunt doar complementare celor date in tabelul de
proceduri si functii dat pentru folosirea cu fisiere text.
Proceduri si functii folosite la lucrul cu fisiere cu tip
Nume
Descriere
Assign Identic cu fisierele text.
Deschide un fisier existent (pentru citire / scriere). Daca fisierul nu exista, aceasta procedura va
genera o eroare.
Reset Dupa ce fisierul a fost deschis, pozitia in fisier (file pointer-ul) este setata la inceputul acestuia.
Daca variabila de fisier a fost asignata unui sir vid, dupa apelul acestei proceduri, variabila de
fisier se va referi la intrarea standard (tastatura, de obicei).
Rewrite Creaza un fisier nou si il deschide (pentru scriere / citire). Daca fisierul exista, atunci el este
sters si recreat (gol). Daca variabila de fisier este asignata unui fisier deschis, acesta va inchis,
Seek
Restrictii:
Fisierul trebuie sa fie deschis.
Nu poate fi folosita cu fisiere text.
Muta pozitia in fisier (file pointer) la cea specificata. Urmatoarea citire sau scriere se face din
acel loc.
Numarul primei componente din fisier este 0. Noua pozitie care poate fi specificata este de tip
Longint, deci nu poate merge mai departe de 2 GB. Pentru a scrie la sfarsitul fisierului (dupa
ultima componenta) se poate folosi cu impreuna cu rezultatul functiei FileSize.
Daca pozitia este chiar la inceputul fisierului, atunci aceasta functie returneaza 0. Daca pozitia
este la sfarsitul fisierului, atunci rezultatul lui FilePos este egal cu cel al functie FileSize,
prezentata mai sus.
Restrictii:
Fisierul trebuie sa fie deschis.
Niciodata nu mi-a placut restrictia care spunea ca aceasta procedura / functie nu poate fi folosita cu fisiere text, asa ca am cautat
o solutie. Solutia evidenta este sa folositi un fisier cu componente de tip Char (practic, text), putand astfel folosi si functii gen
FileSize, FilePos, Seek, Truncate. Totusi, probabil ca ati vrea sa aveti grija la sfarsiturile de linie / fisier
Descriere
f:text;
begin
assign(f,'bani.in');reset(f);
for i:=1 to 7 do readln(f,a[i],b[i]);
close(f);
write('s=');readln(s);
for i:=7 downto 1 do
begin
num[i]:=s div a[i];s:=s mod a[i];
if num[i]>b[i] then begin s:=s+(num[i]-b[i])*a[i];num[i]:=b[i];
end;
end;
if s<>0 then
writeln('Nu este posibil de efectuat plata cu bancnotele
respective!')
else begin
writeln('Suma este achitata cu urmatoarele bancnote:');
for i:=7 downto 1 do if num[i]<>0 then
writeln(a[i],'-',num[i]);
end;
end.
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.
3.Se citete de la tastatur o valoare natural nenul n (n<=30000), apoi n valori ntregi de cel mult 4 cifre.
Se cere s se afieze n fiierul date.out valorile impare. Valorile se vor scrie pe un singur rnd separate
printr-un spaiu. (Problem rezolvat la tabl de Brle Dan)
var f:text;
n,i,x:integer;
begin
assign(f,date.out);
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.