Documente Academic
Documente Profesional
Documente Cultură
Lucrarea 4 - Fisiere
Lucrarea 4 - Fisiere
FILE *fişier;
Argument Descriere
r Deschide un fişier text pentru citire.
w Creează un fişier text pentru scriere. Dacă acesta există, este suprascris.
Deschide un fişier text în modul adăugare. Textul este adăugat la sfârşitul
a
fişierului.
rb Deschide un fişier binar pentru citire.
wb Creează un fişier binar pentru scriere. Dacă acesta există, este suprascris.
Deschide un fişier binar în modul adăugare. Data este adăugată la sfârşitul
ab
fişierului.
r+ Deschide un fişier text pentru citire şi scriere.
Creează un fişier nou pentru citire şi scriere. Dacă fişierul există, este
w+
suprascris.
a+ Deschide un fişier text pentru citire şi scriere, la sfârşit.
r+b or rb+ Deschide un fişier binar pentru citire şi scriere.
w+b or Creează un fişier binar pentru citire şi scriere. Dacă fişierul există, este
wb+ suprascris.
a+b or ab+ Deschide un fişier binar pentru citire şi scriere, la sfârşit.
Încercarea de a face operaţii cu fişierul în plus faţă de ceea ce ne permite modul în care
acesta a fost deschis, va genera o eroare din partea mediului de programare.
În practică funcţia fopen( ) este de cele mai multe ori inclusă într-un if:
Prin aceasta se verifică dacă fopen a reuşit să deschidă fişierul, în caz contrar
returnând NULL. Pentru a evita eroarea care ar urma să fie generată de program mai departe,
când ar încerca să folosească acel fişier nedeschis, se poate apela funcţia de terminare
program:
După ce s-a încheiat lucrul cu fişierul, acesta va trebui închis, folosind funcţia close().
De abia după aceea va putea fi eventual redeschis pentru un alt scop (de exemplu era deschis
pentru citire, si se doreşte redeschiderea lui pentru scriere). Funcţia are sintaxa:
fclose (fisier);
După apelul aceste funcţii, nu se mai pot efectua nici un fel de operaţii asupra
fişierului, până la o nouă deschidere.
fread(&pret,sizeof(pret),1,fisier);
unde: preţ este variabila în care se citeşte şi care poate fi de oricare din tipurile
predefinite sau definite de utilizator din C. Astfel încât nu contează că preţ este de tipul int,
double sau că este o structură definită de utilizator.
Observăm că nu trebuie să specificăm noi neapărat dimensiunea, mai ales că este
posibil să nu o ştim exact. Ea este returnată de funcţia sizeof( ). Fişier reprezintă pointerul
către fişierul de utilizat, descris mai sus.
Scrierea în fişier
Pentru a putea scrie în fişier acesta trebuie în primul rând să fie deschis într-un mod
care permite scrierea. De asemenea trebuie să avem grijă unde scriem, deoarece atunci când
apelăm funcţia de scriere, aceasta va scrie începând cu poziţia curentă, indiferent dacă
suprascrie alte date sau nu.
fwrite(&pret,sizeof(pret),1,fisier);
remove(”nume_fisier”);
rename( ”nume_vechi”, ”nume_nou” );
Stergerea logică nu implică nici o ştergere fizică din fişier. De aceea este mult mai
rapidă. Ea implică introducerea unui caracter special în înregistrarea scrisă (respectiv o nouă
variabilă sters de tip boolean care să aibă valoarea true implicit sau false dacă am şters
înregistrarea, pentru cazul în care avem structuri) care să ne semnaleze că înregistrarea
respectivă „este ştearsă” şi va trebui ignorată de acum înainte în toate operaţiile din fişier.
Exemplu: avem variabila pret care are valoarea 500. Atunci când dorim să o
ştergem, îi vom modifica doar valoarea în fişier din 500 în -500 (am adăugat semnul minus).
Prin convenţie, am stabilit că nu există nici un preţ negativ. Prin introducerea semnului
minus, am semnalat că înregistrarea respectivă „am şters-o” şi va trebui ignorată pentru
operaţiile ulterioare de citire şi scriere, deşi ea există în continuare în fişier.
Atenţie:
Dacă avem următoarea secvenţă de înregistrări în fişier: -200 500 600 900 şi dorim
să modificăm valoarea înregistrării 500, în 550, va trebui să ne poziţionăm în fişier după
primii sizeof(preţ) octeţi (adică înainte de înregistrarea numărul 2) şi nu la începutul
fişierului, căci chiar dacă prima înregistrare este ştearsă logic (-200), ea există în fişier.
typedef struct{
int numar;
int sold;
}cont;
void main(void)
{
char fisier[]="banca.dat";
int tasta;
do{
printf("\ni-iesire "
"c-creare fisier "
"a-adaugare cont "
"d-depunere "
"l- listare "
);
}
}while(tasta!='i');
}
if((f=fopen(nume,"ab"))!=NULL)
{
printf("numar cont:");
scanf("%d",&c.numar);
getchar();
c.sold=0;
fwrite(&c,sizeof(c),1,f);
Probleme propuse.
1. Să se creeze un fişier care să conţină datele dintr-un vector citit de la tastatură, iar
apoi să se sorteze datele scrise în fişier (să se sorteze fişierul), după un câmp oarecare,
folosind quicksort.