Sunteți pe pagina 1din 5

Fiiere text

1.Obiective
nsuirea lucrului cu principalele funcii specifice fiierelor text; Implementarea unei aplicaii de salvare/citire a datelor matriceale n/din fiierele text; Generarea fiierelor html i a fiierelor log n cadrul aplicaiei.

2.Aspecte teoretice
Memoria intern este limitat att din punctul de vedere al persistenei datelor (datele nu mai sunt disponibile dup sesiunea de lucru) ct i din punctul de vedere al capacitii (exist o multitudine de aplicaii care utilizeaz cantiti foarte mari de date). Singura modalitate de a stoca i accesa cantiti mari de date persistente este oferit de dispozitivele de stocare externe (hard-disk, CD, DVD, flash). Din punct de vedere logic, aceste dispozitive organizeaz datele sub forma fiierelor. Transferul datelor din memoria intern ntr-un fiier poart denumirea de salvarea datelor. Transferul invers presupune citirea din fiier a datelor. citire tastatur salvare HDD (fiiere) DESCHIDERE/NCHIDERE nume identificatorul fiierului; mod modul de deschidere al fiierului; returneaz un pointer la fiier sau NULL (n caz de eec la deschidere). fclose (fp) fp un pointer valid la fiier; returneaz zero (nchidere cu succes) sau EOF (eroare la nchidere).
fopen (nume, mod)

memoria RAM (variabile)

afiare ecran citire din fiier

fputc (c,fp) fputs (sir,fp) fprintf (fp,format,arg)

SCRIERE (toate funciile returneaz EOF n caz de eroare la scriere sau sfrit de fiier) scrie caracterul c n fiierul pointat de fp. scrie irul de caractere sir n fiierul pointat de fp. similar cu printf dar scrierea se realizeaz n fiierul reprezentat de fp. CITIRE citete un caracter din fiierul pointat de fp; returneaz caracterul citit sau EOF n caz de eroare sau sfrit de fiier. citete n tabloul ir pn se ajunge la un caracterul \n sau au fost citite lung-1 caractere; returneaz NULL la eroare sau sfrit de fiier. similar cu scanf dar citirea se realizeaz din fiierul reprezentat de fp; returneaz nr. de cmpuri scanate cu succes sau EOF (sfrit de fiier).

fgetc (fp) fgets (sir,lung,fp) fscanf (fp,format,arg)

3.Exemple
Exemplul 1 salvarea/citirea unui vector n/din fiier Un program minimal ce opereaz cu iruri de numere ntregi trebuie s implementeze funciile de citire de la tastatur i afiare pe ecran. Utiliznd fiiere se pot implementa nc dou funcii, una care s realizeze salvarea unui vector ntr-un fiier iar alta citirea unui vector din fiier. Trebuie respectat un anumit format al fiierului. Convenim ca s scriem pe prima linie a fiierului numrul de elemente ale irului iar pe linia urmtoare elementele, separate prin spaiu. De exemplu, dup salvarea vectorului {2, -3, 0, 8}, fiierul trebuie s conin:
4 2 -3 0 8

Funcia de salvare a vectorului primete ca argumente numrul de elemente - n, vectorul - v i numele fiierului n care se dorete salvarea vectorului - numeFisier. Aceast funcie returneaz valoarea 1 (unu) dac nu au aprut erori la deschiderea fiierului i 0 (zero) n caz contrar.
int salvareVector (int n, int *v, char *numeFisier){ FILE *fp; //fp este un pointer catre un fisier int i; //se deschide fisierul in mod scriere (write) fp = fopen (numeFisier, "w "); //daca fisierul nu poate fi deschis, se returneaza fals logic if (fp == NULL) return 0; //daca fp este un pointer valid atunci se pot scrie datele fprintf (fp, "%d\n ",n); //se scrie numarul de elemente for (i=0;i<n;i++) //se scriu succesiv elementele fprintf (fp, "%d ",v[i]); fclose (fp); //inchidere fisier return 1; //salvarea datelor s-a incheiat cu succes }

Funcia de citire din fiier a vectorului primete ca argumente un pointer la numrul de elemente - n, vectorul - v i numele fiierului din care se dorete citirea vectorului - numeFisier. Returneaz valoarea 1 (unu) dac nu au aprut erori la deschiderea fiierului i 0 (zero) n caz contrar.
int citireVectorFisier (int *n, int *v, char *numeFisier){ FILE *fp; int i; //se deschide fisierul in mod citire (read) fp = fopen (numeFisier, "r "); if (fp == NULL) return 0; fscanf (fp, "%d ",n); //se citeste numarul de elemente for (i=0;i<*n;i++) //se citesc succesiv elementele fscanf (fp, "%d ",&v[i]); fclose (fp); return 1; //citirea datelor din fisier s-a incheiat cu succes }

Exemplul 2 copierea coninutului unui fiier text n altul n cadrul acestui exemplu se va prezenta o funcie care copie coninutul unui fiier n altul. Funcia primete ca argument numele fiierelor surs i destinaie (n aceast ordine). Returneaz valoarea 0 (zero) dac a aprut eroare la deschiderea fiierelor i 1 (unu) n caz contrar.
int copiereFisiere (char *numeSursa, char *numeDest){ FILE *fpSursa, *fpDest; // pointeri la cele doua fisiere char c; // variabila de "manevra" //se incearca deschiderea pentru citire a fisierului sursa if ((fpSursa=fopen(numeSursa, "r "))==NULL) return 0; //se incearca deschiderea pentru scriere a fisierului destinatie if ((fpDest=fopen(numeDest, "w "))==NULL) return 0; /*se citesc caractere din fisierul sursa si se scriu in fisierul destinatie pana cand functia fgetc() returneaza EOF*/ while ((c=fgetc(fpSursa))!=EOF) fputc(c,fpDest); //se inchid fisierele utilizate fclose (fpSursa); fclose (fpDest); return 1; }

Varianta prezentat realizeaz copierea caracter cu caracter. n cazul fiierelor text poate fi mai performant o copiere linie cu linie. n continuare este prezentat secvena de copiere pentru acest mod de implementare. Pentru dimensiunea tabloului n care se memoreaz o linie s-a utilizat macroul MAX_LINIE. Cu alte cuvinte, presupunem c numrul maxim de caractere de pe o linie din fiierul surs este MAX_LINIE 1 (la sfritul irului trebuie adugat caracterul \0).
int copiereFisiere2 (char *numeSursa, char *numeDest){ FILE *fpSursa, *fpDest; char buf[MAX_LINIE]; // variabila de manevra // . . . . . deschidere fisiere //cand ajunge la sfarsitul fisierului fgets() returneaza NULL while (fgets(buf,MAX_LINIE-1,fpSursa)!=NULL) fputs(buf,fpDest); // . . . . . inchidere fisiere return 1; }

Exemplul 3 testarea existenei unui fiier Funcia care testeaz existena unui fiier primete ca argument numele acestuia. Se bazeaz pe faptul c fopen() returneaz NULL dac se ncearc deschiderea n citire a unui fiier inexistent.
int existaFisier (char *numeFisier){ FILE *fp; //daca fisierul poate fi deschis pentru scriere atunci el exista return (fp=fopen (numeFisier, "r"))==NULL ? 0 : (fclose(fp),1); }

4.Exerciii propuse
Exerciiul 1 S se realizeze o aplicaie tip meniu cu urmtoarele opiuni:
C A S F B citire matrice de la tastatura afisare matrice pe ecran salvare matrice in fisier citire matrice din fisier realizarea unui backup a fiierului de la cazul S (daca fisierul de backup exista deja se va intreba daca se doreste suprascrierea)

Referitor la formatul datelor n fiier, pe prima linie se vor scrie numrul de linii i numrul de coloane separate prin spaiu. Apoi se vor scrie pe linii succesive liniile matricei (elementele separate prin spaiu). Coninutul fiierului dup salvarea matricei {{4,9, 2}{0,6,1}} va fi:
2 3 4 9 2 0 6 1

Exerciiul 2 Din ce n ce mai multe aplicaii i prezint datele n format html. Fiierele html sunt n acest caz generate pe baza unor date necunoscute iniial. Ele se mai numesc fiiere generate on the fly (din zbor). Aplicaia anterioar poate fi extins n acest sens prin adugarea unei opiuni (H generare html). Accesarea ei trebuie s determine generarea unui fiier html care, deschis cu ajutorul unui browser, s afieze matricea sub forma unui tabel ca n exemplul urmtor: Matrice: 2 linii, 3 coloane 492 061
<html> <head><title>Matrice</title></head> <body>Matrice: 2 linii, 3 coloane.<br> <table border='1'> <tr><td>4</td><td>9</td><td>2</td></tr> <tr><td>0</td><td>6</td><td>1</td></tr> </table></body></html>

Exerciiul 3 Multe din aplicaiile profesioniste genereaz n mod invizibil pentru utilizator aa numitele log file (fiiere jurnal). Acestea memoreaz aciunile utilizatorilor i sunt utile att pentru urmrirea operaiile efectuate ct i pentru identificarea anumitor erori ascunse ale aplicaiei. S se modifice aplicaia anterioar astfel nct s se genereze (i actualizeze) un fiier log. n acest fiier se va aduga opiunea aleas urmat de data i ora activrii conform modelului:
. F A X . . . Sat Sat Sat . . Sep Sep Sep . . . . . . 21 09:03:52 21 09:04:10 21 09:04:23 . . . . 2002 2002 2002

Coordonatele temporale se pot obine utiliznd funciile time() i ctime(). Suplimentar se va aduga opiunea L afiare log file care va permite vizualizarea nregistrrilor din fiierul jurnal. Dac numrul de nregistrri depete numrul de linii disponibile ale ecranului atunci afiarea trebuie s se realizeze paginat.

4.Exerciii suplimentare
Exerciiul 1 program multilingv Aplicaiile profesioniste pstreaz mesajele ce trebuie afiate utilizatorului n anumite fiiere text. Aceast abordare este foarte util deoarece dac se dorete modificarea unui mesaj nu este nevoie s se modifice codul surs al programului i ulterior s se recompileze sursele. Nu trebuie modificat dect mesajul n fiier. Similar, dac se dorete lansarea unei versiuni n alt limb, nu trebuie dect s fie furnizat fiierul corespunztor cu mesaje. S se extind aplicaia de la laborator n sensul c utilizatorul poate specifica limba n care s ruleze programul (englez sau romn). Dup alegerea limbii aceasta devine implicit pn cnd utilizatorul selecteaz cealalt limba. Exerciiul 2 convertor pseudocod - C Una din cele mai frecvente utilizri ale fiierelor text n programare este ca fiiere surs. Se propune implementarea unei aplicaii cu urmtorul meniu: P alegere fisier surs PSC si convertire in fiier surs C (test suprascriere) C alegere fisier C si convertire in fisier executabil EXE (prin apelarea compilatorului C) R alegere fisier EXE si lansare in executie Oservaii: Se presupune c fiierele PSC sunt corecte sintactic; Se consider doar instruciuni simple (start, stop, declarare variabile, scriere, citire); Pentru lansarea n execuie a unui program din cadrul altui program se poate utilizeaza funcia spawnl ().

S-ar putea să vă placă și