Documente Academic
Documente Profesional
Documente Cultură
Lab 01
Lab 01
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)
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).
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 ().