sem 05 - anexa aspecte teoretice

6
Anexa Nivelul superior de prelucrare a fişierelor (funcţii) La acest nivel, un fişier se descrie ca pointer către o structură predefinită (FILE, in stdio.h): FILE* f; Funcţiile folosite la acest nivel: - funcţii de prelucrare generale (se aplică tuturor fişierelor, indiferent de tipul informaţiei conţinute; prelucrarea efectuată de acestea nu are nici un efect asupra conţinutului fişierului.) - funcţii de citire/scriere cu conversie (se aplică fişierelor care conţin informaţie de tip text (linii de text, separate prin perechea CR/LF, iar la sfîrşit se găseşte caracterul CTRL-Z)) - şi funcţii de citire/scriere fără conversie (se aplică fişierelor care conţin informaţie binară). Funcţii de prelucrare generală fopen -- Deschiderea şi asignarea. Funcţia returnează un pointer spre o structură de tip FILE sau NULL dacă fişierul nu se poate deschide: FILE* fopen(const char* nume_extern,const char* mod); nume_extern constituie specificatorul de fişier iar, mod este un şir de caractere care specifică modul de deschidere a fişierului. 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 fişier sînt prezentate în tabelul 5.1. Tabelul 1. Modurile de deschidere a unui fişier Mod Scop a Deschide un fişier existent pentru adăugare la sfîrşit (extindere) sau îl creează dacă nu există. Este permisă numai scrierea. Numai pentru fişiere 1

Upload: oana-vasile

Post on 30-Sep-2015

1 views

Category:

Documents


0 download

DESCRIPTION

atp

TRANSCRIPT

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.

Tabelul 1. Modurile de deschidere a unui fiier

ModScop

aDeschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz dac nu exist. Este permis numai scrierea. Numai pentru fiiere text.

rDeschide un fiier existent numai pentru citire

wSuprascrie un fiier existent sau creeaz unul nou, permindu-se numai operaia de scriere

a+Deschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz dac nu exist. Snt permise citiri i scrieri. Numai pentru fiiere text.

r+Deschide un fiier existent pentru citire i scriere

w+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 gestiuneFiiere textFiiere binare

crearewwb

consultarerrb

actualizarer+b

Creare i actualizarew+rwb, w+b

Extinderea

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; size_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.PAGE 3