Sunteți pe pagina 1din 4

Anexa

Nivelul superior de prelucrare a fiierelor (funcii)


La acest nivel, un fiier se descrie ca pointer ctre o structur predefinit (FILE, in stdio.h):
FILE* f;

Funciile folosite la acest nivel:


funcii de prelucrare generale (se aplic tuturor fiierelor, indiferent de tipul informaiei coninute; prelucrarea
efectuat de acestea nu are nici un efect asupra coninutului fiierului.)
funcii de citire/scriere cu conversie (se aplic fiierelor care conin informaie de tip text (linii de text,
separate prin perechea CR/LF, iar la sfrit se gsete caracterul CTRL-Z))
i funcii de citire/scriere fr conversie (se aplic fiierelor care conin informaie binar).

Funcii de prelucrare general


fopen -- Deschiderea i asignarea. Funcia returneaz un pointer spre o structur de tip FILE sau NULL dac
fiierul nu se poate deschide:
FILE* fopen(const char* nume_extern,const char* mod);

nume_extern constituie specificatorul de fiier iar,


mod este un ir de caractere care specific modul de deschidere a fiierului.
Asignarea se realizeaz prin expresie de atribuire de tipul:
nume_intern=fopen(sir_nume_extern,sir_mod);

Exemplu:

FILE* f;
f = fopen("PROD.DAT","r");

Modurile n care poate fi deschis un fiier snt prezentate n tabelul 5.1.


Mod
a
r
w
a+
r+
w+

Tabelul 1. Modurile de deschidere a unui fiier


Scop
Deschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz
dac nu exist. Este permis numai scrierea. Numai pentru fiiere text.
Deschide un fiier existent numai pentru citire
Suprascrie un fiier existent sau creeaz unul nou, permindu-se numai
operaia de scriere
Deschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz
dac nu exist. Snt permise citiri i scrieri. Numai pentru fiiere text.
Deschide un fiier existent pentru citire i scriere
Suprascrie un fiier existent sau creeaz unul nou, permindu-se att citiri ct
i scrieri.

La opiunile de mai sus se poate aduga b pentru fiiere binare sau t pentru fiiere text.
Dac nu este prezent nici litera b nici litera t, modul considerat depinde de valoarea variabilei _fmode : dac
valoarea este O_BINARY, se consider fiier binar; dac valoarea este O_TEXT, se consider fiier text. De obicei
implicit este valoarea O_TEXT.

Modurile uzuale pentru deschiderea fiierelor snt prezentate n tabelul 5.2.


Tabelul 2. Moduri uzuale pentru deschiderea fiierelor
Operaia de gestiune Fiiere text Fiiere binare
Creare
w
wb
Consultare
r
rb
Actualizare
r+b
Creare i actualizare
w+
rwb, w+b
Extindere
a
nchiderea fiierelor se realizeaz prin apelul funciei fclose, care are urmtorul prototip:
int fclose(FILE* f);

Funcia nchide fiierul primit ca parametru.


Returneaz valoarea 0 n caz de succes sau -1, n caz de eroare.
nainte de nchiderea fiierului, snt golite toate zonele tampon asociate lui. Zonele tampon alocate automat de sistem
snt eliberate.
Revenirea la nceputul fiierului se realizeaz prin funcia rewind, cu prototipul:
void rewind(FILE *f);

Efect: poziionarea la nceputul fiierului f (care era deschis anterior), resetarea indicatorului de sfrit de fiier i a
indicatorilor de eroare (se nscrie valoarea 0). Dup apelul lui rewind poate urma o operaie de scriere sau citire din
fiier.
Testarea sfritului de fiier, se realizeaz prin apelul macrodefiniiei feof:
int feof(FILE* f);

Macro-ul furnizeaz valoarea indicatorului de sfrit de fiier asociat lui f. Valoarea acestui indicator este setat la
fiecare operaie de citire din fiierul respectiv. Valoarea ntoars este 0 (fals) dac indicatorul are valoarea sfrit de
fiier i diferit de zero (adevrat) n caz contrar. Apelul lui feof trebuie s fie precedat de apelul unei funcii de citire
din fiier. Dup atingerea sfritului de fiier, toate ncercrile de citire vor eua, pn la apelul funciei rewind sau
nchiderea i redeschiderea fiierului .
Golirea explicit a zonei tampon a unui fiier se realizeaz prin apelul funciei fflush, care are urmtorul
prototip:
int fflush(FILE* f);

Dac fiierul f are asociat o zon tampon de ieire, funcia scrie n fiier toate informaiile din acesta, la poziia
curent. Dac fiierul are asociat o zon tampon de intrare, funcia l golete. n caz de succes returneaz valoarea
zero, iar n caz de eroare valoarea EOF (definit n stdio.h).

Exemplu: nainte de a citi un ir de caractere de la tastatur, zona tampon trebuie golit pentru a preveni citirea unui
ir vid (datorit unei perechi CR/LF rmase n zona tampon de la o citire anterioar a unei valori numerice). tergerea
se realizeaz prin apelul:
fflush(stdin);

Aflarea poziiei curente n fiier se realizeaz prin apelul uneia din funciile fgetpos sau ftell:
int fgetpos(FILE* f,fpos_t* poziie);

Dup apel, la adresa poziie se afl poziia pointerului de citire/scriere din fiierul f, ca numr relativ al octetului
curent. Primul octet are numrul 0. Valoarea returnat poate fi folosit pentru poziionare cu funcia fsetpos. n caz de
succes funcia ntoarce valoarea 0, iar n caz de eroare o valoare nenul i seteaz variabila errno la valoarea EBADF
sau EINVAL.
long ftell(FILE* f);

returneaz poziia n fiierul f a pointerului de citire/scriere n caz de succes sau -1L n caz contrar. Dac fiierul este
binar, poziia este dat n numr de octei fa de nceputul fiierului. Valoarea poate fi folosit pentru poziionare cu
funcia fseek.
Modificarea poziiei pointerului de citire/scriere se poate face prin poziionare relativ:
int fseek(FILE* f,long deplasare,int origine);

unde deplasare reprezint numrul de octei cu care se deplaseaz pointerul n fiierul f, iar origine reprezint poziia
fa de care se deplaseaz pointerul. Parametrul origine poate fi: SEEK_SET (0) poziionare fa de nceputul
fiierului; SEEK_CUR (1) poziionare fa de poziia curent; SEEK_END (2) poziionare fa de sfritul
fiierului. Funcia returneaz valoarea 0 n caz de succes (i uneori i n caz de eec). Se semnaleaz eroare prin
returnarea unei valori nenule numai n cazul n care f nu este deschis.
Poziionarea absolut se face cu funcia:
int fsetpos(FILE* f,const fpos_t poziie);

Pointerul de citire/scriere se mut n fiierul f la octetul cu numrul indicat de parametrul poziie (care poate fi o
valoare obinut prin apelul lui fgetpos).
Ambele funcii reseteaz indicatorul de sfrit de fiier i anuleaz efectele unor eventuale apeluri anterioare
ale lui ungetc asupra acelui fiier.
Redenumirea sau mutarea unui fiier existent se poate realiza prin apelul funciei rename, care are urmtorul
prototip:
int rename(const char* n_vechi,const char* n_nou);

unde n_vechi reprezint vechiul nume al fiierului, iar n_nou reprezint numele nou.
Dac numele vechi conine numele discului (de exemplu C:), numele nou trebuie s conin acelai nume de disc.
Dac numele vechi conine o cale, numele nou nu este obligat s conin aceeai cale. Folosind o alt cale se obine
mutarea fiierului pe disc. Folosind aceeai cale (sau nefolosind calea) se obine redenumirea fiierului. Nu snt
permise wildcard-uri (?, *) n cele dou nume.

n caz de succes se ntoarce valoarea 0. n caz de eroare se ntoarce -1 i errno primete una din valorile:
ENOENT nu exist fiierul, EACCES nu exist permisiunea pentru operaie sau ENOTSAM dispozitiv diferit
(mutarea se poate face doar pe acelai dispozitiv).
tergerea unui fiier existent se poate realiza prin apelul funciei unlink, prezentat anterior, sau remove, care
are urmtorul prototip:
int remove(const char* cale);

unde cale reprezint specificatorul fiierului (trebuie s fie nchis).

Citirea dintr-un fiier binar se realizeaz prin apelul funciei fread, care are urmtorul prototip:
size_t fread(void* ptr,size_t dim,size_t n,FILE* f);

Funcia citete din fiierul f, de la poziia curent, un numr de n entiti, fiecare de dimensiune dim, i le depune, n
ordinea citirii, la adresa ptr. fread returneaz numrul de entiti citite. n total se citesc, n caz de succes, n*dim octei.
n caz de eroare sau cnd se ntlnete sfritul de fiier, funcia returneaz o valoare negativ sau 0; s ize_t este definit
n mai multe header-e (ntre care stdio.h) i este un tip de dat folosit pentru a exprima dimensiunea obiectelor din
memorie. Este compatibil cu tipul unsigned.
Exemplu:
struct complex {int x,y} articol;
FILE * f_complex;
if(f_complex=fopen("NR_COMPL.DAT", "rb")
fread(&articol,sizeof(articol),1,f_complex);
else printf("Fisierul nu poate fi deschis");

n exemplul anterior se deschide un fiier binar din care se citete un articol de tip struct complex care se depune n
variabila articol.

Scrierea ntr-un fiier binar se poate realiza prin apelul funciei fwrite, care are urmtorul prototip:
size_t fwrite(const void* ptr,size_t dim,size_t n,FILE* f);

Funcia scrie n fiierul f, ncepnd cu poziia curent, un numr de n entiti contigue, fiecare de dimensiune dim,
aflate n memorie la adresa ptr; fwrite returneaz numrul entitilor scrise cu succes. n caz de eroare se returneaz o
valoare negativ.
Exemplu:
struct complex {int x,y} articol;
FILE *pf;
pf=fopen("NR_COMPL.DAT","wb");
fwrite(& articol,sizeof (articol),1,pf);

Exemplul anterior creeaz un fiier binar nou n care scrie o secven de octei coninnd reprezentarea binar a unei
date de tip struct complex.