CATEGORII DOCUMENTE |
operaTii cu FiSiere
1. De departe, pentru dezvoltari ulterioare de programe, tipul fisier ("FILE OF") este cel mai important dintre tipurile complexe (alaturi de tipul ARRAY). Toate programele prezentate pana acum prezentau un mare neajuns: la introducerea datelor, orice eroare "neprotejata" (sau "neprotejabila") conducea fie la blocarea imediata a programului, fie la rezultate inutilizabile. La programele cu seturi mari de date de intrare (cum ar fi cele cu matrici), chiar in lipsa vreunei erori, procedura de introducere de la tastatura este greoaie si plictisitoare, mai ales in faza de punere la punct a programului (dar si la exploatarea ulterioara). Pe de alta parte, programele care produc rezultate multe (matrici) sunt dificil sau imposibil de urmarit pe ecran datorita defilarii.
Apare deci intrebarea daca nu este posibila inlocuirea "periferiei" programelor cu fisiere. Avantajul lor este imens: fisierele de intrare vor fi scrise separat, O SINGURA DATA, in vreme ce fisierele de iesire vor putea fi consultate secvential DE MAI MULTE ORI (chiar daca programul a fost rulat o singura data). Accesul direct la fisiere de date al Pascal-ului este posibil datorita (in primul rand) existentei tipului fisier. Mai mult, instructiunile READ si WRITE au fost concepute special pentru a putea sa utilizeze fisierele de date (vezi capitolul 6).
Deoarece fisierele, spre deosebire de toate entitatile manevrate de Pascal (in memorie), au o imagine fizica (corespund unei imagini pe disc), exista cateva functii si proceduri predefinite destinate special transferului de date intre memorie si disc. Cele mai importante sunt tabelate mai jos, iar folosirea lor este obligatorie.
Inainte de a folosi fisiere, sa subliniem cateva aspecte importante: un fisier are doua nume in Pascal, si anume cel fizic, sub care il "stie" sistemul de operare, respectiv cel "logic", cu rol de variabila in Pascal (identificator). Declaratia fisierelor este extrem de simpla, tipul fisier fiind cel mai permisiv din Pascal: un fisier poate contine orice structuri formate din orice tipuri, mai putin alte fisiere. Cel mai simplu (si mai apropiat de notiunea de fisier ca structura de baza a sistemului de operare) este fisierul de tip "TEXT". Declaratia este echivalenta cu "FILE OF CHAR". Spre deosebire de alte fisiere, cel de tip TEXT este numai cu acces secvential (elementele fisierului sunt "rasfoite" unul cate unul, pana la gasirea celui cautat). Alte fisiere pot avea si acces direct sau (aleator), in care gasirea unui element anume se face cu ajutorul unei (sau unor) "chei" (structuri de ordonare ale fisierului respectiv - ordine alfabetica, crescatoare, etc.). Este recomandabila (cel putin la inceput) folosirea exclusiva a fisierelor TEXT.
Nume (apel) |
Parametri |
Actiune |
APPEND |
f: FILE |
Deschide fisierul f pentru scriere in "coada" |
ASSIGN |
f: FILE; n: STRING |
Coreleaza fisierul f (logic) cu cel fizic, al carui nume este n (inclusiv litera discului si calea) |
CLOSE |
f: FILE |
Inchide fisierul f |
ERASE |
f: FILE |
Sterge fisierul f (cel fizic asociat) |
RENAME |
f: FILE; n: STRING |
Redenumeste fisierul f (cel fizic asociat) cu numele n |
RESET |
f: FILE |
Deschide fisierul f pentru citire |
REWRITE |
f: FILE |
Deschide fisierul f pentru scriere; daca fisierul exista deja, continutul sau este STERS |
SEEK |
f: FILE; n: INTEGER |
La fisierele cu acces direct, muta cursorul cu n pozitii inainte |
Proceduri destinate operatiilor cu fisiere.
Sa observam ca un acelasi fisier nu poate fi SIMULTAN deschis pentru citire si scriere. Eventual, daca se doreste actualizarea unui fisier, cele doua operatii trebuie facute pe rand.
Nume |
Parametri (tip) |
Actiune (rezultat) |
EOF |
f: FILE |
Produce o valoare logica corespunzatoare sfarsitului de fisier |
EOLN |
f: FILE |
Produce o valoare logica corespunzatoare sfarsitului unei linii dintr-un fisier |
FILEPOS |
f: FILE |
Da un numar intreg ce reprezinta pozitia cursorului |
FILESIZE |
f: FILE |
Da un numar intreg ce reprezinta marimea fisierului f |
Functii destinate operatiilor cu fisiere.
2. Un prim exemplu consta in calculul normei unui vector, citind numarul elementelor si valorile lor dintr-un fisier text. Reamintim ca norma unui vector este
program norma;
type vect = array[1..10] of integer;
var x :vect;
fich :text;
max,i,n:integer;
begin
assign (fich,'vector.dat');
reset (fich);
readln(fich,n);
for i:=1 to n do
readln(fich,x[i]);
close(fich);
max:=x[1];
for i:=2 to n do
if max < abs(x[i]) then max:=abs(x[i]);
writeln('Norma vectorului este ',max);
end
Fisierul de date "fich" trebuie creat cu orice editor (eventual, chiar cel din Turbo Pascal) inainte de a incerca rularea programului. Pe prima linie, fisierul va contine numarul de elemente (n <= 10, conform declaratiei vectorului), iar pe cele n linii urmatoare, cate o valoare numerica. Cele n valori se pot gasi si pe ACEEASI linie, separate prin SPATIU (sau mai multe, dar NU prin virgula!), cu conditia modificarii lui READLN (fich,x[i]) in READ. De exemplu
Acest fisier trebuie salvat apoi cu numele furnizat in program: "vector.dat". Sa subliniem faptul ca instructiunea READ poate citi si cate o valoare de pe fiecare linie, caci trateaza caracterul <ENTER> ca pe un separator legal. Rulati acum programul.
3. Oricare din programele scrise pana acum poate fi modificat in vederea utilizarii fisierelor. Tinand cont de indicatiile de mai sus, structura unui program ce foloseste fisiere pentru a citi, respectiv a scrie matrici poate fi urmatoarea:
program matrici_in_fisiere;
const
nlmax = 10;
ncmax = 10;
type
matnet = array [1..nlmax,1..ncmax] of real;
mattra = array [1..ncmax,1..nlmax] of real;
var
i, j: integer;
nl, nc, format: integer;
matrix: matnet;
matrixt: mattra;
fisini, fisrez: text;
procedure citire_matrice (nl, nc: integer;
var fisier: text;
var m: matnet);
var i, j: integer;
begin
for i := 1 to nl do
begin
for j := 1 to nc do
read (fisier, m[i,j]);
readln (fisier)
end
end;
procedure scriere_matrice (nl, nc: integer;
var fisier: text;
format: integer;
m: mattra);
var i, j: integer;
begin
for i := 1 to nl do
begin
for j := 1 to nc - 1 do
write (fisier, m[i,j]:format,' ');
writeln (fisier, m[i,nc]:format)
end
end;
begin
write ('Numar linii = ');
readln (nl);
write ('Numar coloane = ');
readln (nc);
assign (fisini,'matrice.dat');
reset (fisini);
citire_matrice (nl, nc, fisini, matrix);
close (fisini);
tramat (nl, nc, matrix, matrixt);
write ('Format de scriere: ');
readln (format);
assign (fisrez,'matrice.rez');
rewrite (fisrez);
scriere_matrice (nl, nc, fisrez, format, matrixt);
close (fisrez);
readln
end.
Observati ca sunt permise si alte citiri (de la tastatura) ori scrieri (pe ecran), de exemplu in cazul "tratarii" unor erori. Creati (cu editorul din Norton Commander sau chiar cu Turbo Pascal-ul) fisierul de intrare cu elementele matricii dispuse pe linii si denumiti-l corespunzator; un fisier asemanator va fi generat, cu elementele scrise in formatul cerut. Procedura de transpunere matrici se gaseste intr-un fisier separat (daca nu a fost scrisa inca, acum este momentul!). Introduceti si o alta secventa de calcul intre citire si scriere (de exemplu produsul cu un scalar).
4. In general, datele de intrare pot fi considerate de doua categorii: cele care se nu se schimba niciodata (constante fizico - chimice) se afla (de regula) in fisiere, de la tastatura introducandu-se date care pot varia de la o rulare la alta: presiune, temperatura, concentratie, debit, etc. In ce priveste rezultatele, se recomanda scrierea lor integrala in fisiere, impreuna cu "ecoul" datelor de intrare (pentru a putea fi consultate si alta data).
Sa examinam o aplicatie destinata chimistilor: in multe calcule este necesara masa molara a diverselor substante. Este justificata deci crearea unui fisier continand aceste mase molare, fisier ce poate fi consultat (si actualizat) in mod periodic. Utilizarea principiilor de alcatuire ale bazelor de date reclama gasirea unei codificari simple dar sugestive pentru NUMELE substantelor (este evident ca fisierul, denumit "MMOL.DAT", va consta intr-un tabel cu doua coloane: numele substantei - "cheia" - si masa molara). Conform acestei codificari, programele ce au nevoie de masa molara a unei substante cauta in fisier cheia respectiva (daca nu exista, programul va genera un cod de eroare).
Codificarea prezentata aici utilizeaza numai 6 caractere pentru numele substantelor organice, folosind in acelasi timp prescurtarile uzuale pentru radicalii organici (Me - metil, Et - etil, Vy - vinil, etc.). S-au indicat si izomerii de catena prin prefixele n (normal), i (izo), t (tert), etc. De asemenea, cateva substante anorganice uzuale sunt prezente in lista.
Masa molara
bibliografie
[g/mol]
CH4 16 metan
C2H6 30 etan
C3H8 44 propan
nC4H10 58 n-butan
iC4H10 58 i-butan
nC5H12 72 n-pentan
iC5H12 72 i-pentan
eC5H12 72 neo-pentan
nC6H14 86 n-hexan
cC6H12 84 ciclo-hexan
C6H6 78 benzen
PhMe 92 toluen
oC8H10 106 o-xilen
mC8H10 106 m-xilen
pC8H10 106 p-xilen
PhEt 106 etilbenzen
C10H8 128 naftalina
PhVy 104 stiren
VyVy butadiena
MeOH metanol
EtOH etanol
nPrOH n-propanol
iPrOH i-propanol
nBuOH n-butanol
PhOH fenol
PhCHO 106 benzaldehida
H2 2 hidrogen
O2 32 oxigen
N2 28 azot
C 12 carbon
C8H4O3 148 anhidrida ftalica
C4H2O3 98 anhidrida maleica
CO 28 monoxid de carbon
CO2 44 dioxid de carbon
H2O 18 apa
Aer 28.9 aer
Observati ca a treia coloana furnizeaza numele complet al substantei respective (eventual, se poate adauga si numele conform normelor IUPAC). Completati fisierul cu masele care lipsesc, precum si cu alte substante uzuale, grupate conform capitolelor chimiei (conform unui alt principiu al bazelor de date - structurarea): mai intai hidrocarburile, apoi derivatii halogenati, compusii cu oxigen (in ordinea gradului de oxidare), etc. In cadrul aceleiasi clase de compusi, sortarea se face in ordinea seriilor omoloage, deci cu cresterea masei molare.
Remarcati primele 3 linii ale fisierului; acestea au rol de antet, indicand sursa bibliografica si unitatile de masura ale marimilor din fisier. Alcatuiti un program care sa "gestioneze" acest fisier; este evident ca pe masura ce adaugam linii, va fi tot mai greu sa identificam daca s-a folosit deja o anumita codificare. Este recomandabil ca fisierul sa aiba atasat un program special, de "actualizare" a bazei de date, cu ajutorul caruia citim, sortam dupa diverse chei (cum ar fi in cazul de fata masa molara in ordine crescatoare sau numele codificat sau intreg al substantei in ordine alfabetica), ori scriem in fisierul respectiv.
Secventa de cautare a codificarii (deci de consultare a fisierului) poate fi cea care urmeaza (scrisa aici sub forma unei proceduri):
procedure citire_date (nc, coderr: integer;
var nume: vecstring;
var mmol: vector);
var
ok: boolean;
nume_subst: string [6];
fisini: text;
begin
coderr := 0;
assign (fisini,'mmol.dat');
for j := 1 to nc do
begin
reset (fisini);
readln (fisini);
readln (fisini);
readln (fisini);
ok := false;
repeat
read (fisini, nume_subst);
if nume_subst = nume[j]
then
begin
read (fisini, Mmol[j]);
ok := true
end;
readln (fisini)
until eof (fisini) or ok;
close (fisini);
if not ok
then coderr := 1
end
end;
Observati utilizarea semaforului numeric "coderr" pentru semnalarea lipsei codificarii respective din fisier. Remarcati citirea "oarba" a antetului de fisier (3 linii), precum si utilizarea functiei EOF. Incercati sa scrieti un program care sa realizeze sortarea fisierului dupa un criteriu oarecare.
5. Sa se corecteze urmatorul program:
program presiuni reduse;
const pcr = 225 ;
function pred(p: real);
begin pred := p pcr end;
var fisier: text;
p: real; cod: integer;
sir: sting[3];
begin
assign (fisier,'presiuni.dat);
rewrite (fisier);
while sir <> '' do
begin
readln (sir);
val (sir, p, cod);
if p > 0 and p <= pcr
then
writeln (fisier, pred(p));
else
writeln ('Presiune negativa sau supercritica')
end
end.
Remarcati faptul ca utilizarea functiei definite de utilizator "pred" este prioritara in raport cu functia predefinita cu acelasi nume. De asemenea, retineti posibilitatea de a citi numere exprimate sub forma unor siruri de caractere. Inainte de conversia lor cu functia VAL, alte functii ce opereaza cu sirurile se pot dovedi foarte utile, mai ales in vederea folosirii fisierelor; de exemplu, cu trimitere directa la programul anterior, crearea sirurilor (ce corespund codificarii nominale) de lungime "procusteana" (exact 6 caractere), efectuand, dupa necesitati, trunchierea sirurilor prea lungi, respectiv completarea cu blancuri a celor prea scurte.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1919
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved