Operatii cu fisiere

Funcţiile descrise până în acest moment operează cu echipamentul standard de intrare (tastatura) respectiv de ieşire (ecranul, monitorul). Operaţiile de intrare/ieşire se pot efectua având la bază şi alte echipamente, cum ar fi fişierele.

Sistemul de I/O din C separă printr-o anumită abstractizare programatorul de echipament. Forma abstractă se numeşte stream iar instrumentul efectiv care se poate utiliza este fişierul.

Sistemul de fişiere din C este proiectat să lucreze cu o mare varietate de echipamente, care include terminale, drivere de disc, drivere de unitate de bând, etc. Un fişier în C poate să fie orice, de la un fişier pe disc, un terminal sau o imprimantă. Chiar dacă echipamentele diferă, sistemul de fişiere din C le transformă pe fiecare într-un instrument logic denumit stream.

În C există două tipuri de streamuri:
• text -reprezintă o succesiune de linii de text despărţite prin caracterul newline
• binar -reprezintă o succesiune de octeţi fără nici o structură
La lansarea în execuţie a unui program, se deschid trei fişiere cu canale de tip text:
• stdin -intrarea standard implicit asociată tastaturii
• stdout -ieşirea standard, implicit asociată ecranului monitorului
• stderr -ieşirea standard pentru erori, implicit asociată ecranului monitorului

Toate aceste fişiere standard sunt secvenţiale şi în momentul execuţiei unui program C ele sunt implict definite şi automat deschise iar la terminarea programului ele sunt automat închise. Sistemul I/O permite redirectarea (în afară de stderr) spre alte periferice folosind construcţii de forma:

//pentru redirectarea fişierului stdin
< specificator_fisier //pentru redirectarea fişierului stdout >specificator_fisier

//pentru redirectarea fişierului stdout în scopul de adăugare
>> specificator_fisier

Pentru a putea face referiri la aceste fişiere, este necesară prezenţa directivei #include în cadrul programului. Orice alte fişiere utilizate în program trebuie deschise în mod explicit cu funcţia fopen.

Declaraţia unui fişier în C se face astfel:

FILE *fp;

unde fp este un pointer la tipul FILE, fp devenind identificatorul cu care se poate referi fişierul în orice operaţie de I/O.
Structura de tipul FILE conţine informaţii dependente de implementare cum ar fi: adresa şi lungimea zonei tampon de date, modul de utilizare a fişierului, indicatorul de sfârşit de fişier, indicatorul de poziţie, etc).

Deschiderea unui fişier
Prelucrarea unui fişier presupune deschiderea sa, operaţie prin care i se asociază un canal de intrare/ieşire sau flux (stream), se creează o variabilă structură de tipul FILE (definit în stdio.h) şi se rezervă spaţiu pentru zona tampon utilizată la transferul datelor.
Funcţia fopen() deschide un fişier şi îi asociază un stream, după care returnează pointerul asociat respectivului fişier.
Această funcţie are următorul format:

FILE *fopen(const char *numefisier, const char *mod);

Închiderea unui fişier
Funcţia fclose() închide un fişier asociat unui stream precizat. Această funcţie are următorul format:

int fclose(FILE *flux);

Dacă flux a fost deschis pentru scriere, orice date aflate în zona tampon sunt scrise în prealabil cu un apel al funcţiei fflush(). procesul este denumit flushing (golire) a streamului şi garantează că în buffer nu va rămâne nici o informaţie nescrisă. Toate fişierele se închid automat când programul se termină normal, fie după ultima instrucţiune din funcţia main, fie printr-o apelare a funcţiei exit. în schimb, în cazul blocării programului sau a ieşirii forţate, este posibil să rămână date nescrise în buffer, ducând la pierderea acestora.

Leave a Reply