Sunteți pe pagina 1din 15

Universitatea Tehnic a Moldovei

FCIM
Catedra Calculatoare

RAPORT
la lucrarea de laborator nr. 3
la Structuri de date si algoritmi
Tema: : Elaborarea programelor pentru prelucrarea funciilor cu diverse
structuri i fiiere n limbajul C.

Varianta 3.5 & 4.10

A efectuat:

St. Gr. C-141 Tutunaru Dan

A verificat:

Marin tefan

Chiinu 2015

Sarcina i obiectivele:
-s se analizeze principiile organizrii i gestiunii fiierelor n sistemele de operare i procesarea fiierelor
n limbajul C, apoi i s se analizeze algoritmii i programele (declarri, utilizri, parcurgeri, salvare i
tergeri).
-de studiat i nsuit materialul teoretic prin lansarea exerciiilor de antrenament i verificri ale
cunotinelor (din indicaiile acestea) i s se elaboreze algoritmii i, totodat, s organizeze calculele de
verificare cu explicaii pentru evidenierea esenialului prelucrrii fiierelor cu structuri de date n
elaborarea modelelor soluiei. Toate observaiile se nregistreaz n raport;
-s se preia de la profesor varianta (4,5. Variante pentru lucrul individual) i s se elaboreze algoritmii i i
programul unde s organizeze antetul functiilor i transmiterea functiei apelate adresele variabilelor cu
calculele de verificare i cu explicaii la prelucrarea fiierelor. Pentru aprofundarea i rularea programelor
n limbajul C s se elaboreze scenariile succinte de soluionare cu calculele de verificare i explicaii.
-n baza funciilor de timp i dat din fiierul header time.h apreciai timpul definit de sistem i timpul
execuiei programului n secunde pentru ambele cazuri (tradiional i cu pointeri) i s se descrie scenariile
i principiile de algoritmizare si rezolvare ale problemei n baza diferitor modele de SD complexe,
implementnd subprograme n C;
-n raport s se reflecte toate exemplele efectuate cu analize a tehnicii programrii eficiente cu argumentri
i comentarii, incluznd fiierele cu teste de verificare i vizualizri ale rezultatelor.

Operaiile neelementare. Deoarece un program trebuie s citeasc sau s scrie datele


ntr-un fiier , printr-o metod de acces de un nivel mai nalt, informaiile trec pentru a
ajunge la destinaia lor printr-un bufer (tampon). Acest bufer este o zon de memorie RAM
n care sunt temporar stocate, nainte de a fi transferate la destinaie , informaii citite sau
scrise n fiier . Avantajul const: c nu este necesar de a declana o operaie de intrare /
ieire specific pentru fiecare informaie citit sau scris . Din contra o singur operaie n
program permite de a scrie un bloc de informaii n bufer.
Structurile FILE. Dislocarea memoriei din bufer de tip intare /ieire de un oarecare fiier este
furnizat de variabile de tip FILE. Acesta e dotat cu valori cnd un program deschide un fiier
pentru a-l manipula . Tipul FILE este definit ca o structur, header <stdio.h>. Cmpurile sale
conin adresa tamponu-lui: un pointer spre caracterul lui urmtor n bufer, numrul de carctere,
starea fiierului (dreptul de acces, natura operaiei efectuate asupra fiierului ) i descriptor .
Descriptorul este un numr ntreg care identifica fiierul dat .
Dup cum definete limbajul C noiunea de fiier, el se poate referi la un fiier disc, ecran,
tastatur, port, fiier band, etc. Dei fiierele difer ca form stream-urile sunt aceleai. n C un
stream este o interfa logic ntre computer i unul din diferitele perifericele sale dar, n general
ntre computer i un fiier. Un stream este asociat unui fiier cu ajutorul comenzii open i
eliberat de el prin intermediul close. Exist dou tipuri de stream-uri: binar i text. Stream-ul
text se utilizeaz pentru lucrul cu caractere ASCII. Trebuie de remarcat ns, c atunci cnd
lucrm cu un stream text apare translatorul de caractere, astfel ntlnindu-se cu un caracter
newline, de exemplu, el este convertit ntr-un cod caricatur, de acea nu ntotdeauna ceea ce
vom tasta la monitor va fi salvat n fierul text. n cazul celor binare translatorul nu apare, n fiier
nscriindu-se fiecare bit
Un fisier este o structura dinamica, situata in memoria secundara ( pe suporturi optice sau pe
harddisk ); numarul de elemente ale unui fisier este variabil, chiar nul.. Limbajul C permite
operarea cu fisiere:
de tip text - un astfel de fisier contine o succesiune de linii, separate prin NL ('\n')
de tip binar - un astfel de fisier contine o succesiune de octeti, fara nici o structura.
Definiia structurii FILE n < stdio.h> poate s varieze de la un sistem la altul , n ceea ce
privete numrul tipul, i numrul cmpurilor . Ea conine ntotdeauna informaii precedent
descrise .

Typedef struct { char buffer; /* pointerul spre adresa tamponului */


char */ pointerrul spre caracterul urmtor n tampon */
int cnt; /* numrul de caractere n tampon */
int flags ; /* bii dnd starea fiierului */
int fd ; /* descriptorul */
} FILE;
Fiierul <stdio.h> conine declaraia unui tablou de oarecare structuri FILE. Fiecare element
din acest tablou este o variabil structurat, care poate s stocheze informaii relative la un fiier,
sub forma precedent descris. Pentru a acceda concret la un fiier n programul dat, trebuie de
utilizat un pointer spre o variabil de tip FILE. Trebuie de definit pointerul:
FILE * fp ; /*
pointer spre variabila structurat FILE
Definiia precedent creaz un pointer fp de tip pointer spre FILE, capabil de a memoriza
adresa unei variabile structurate FILE. Deoarece un fiier este deschis pentru a fi manipulat,
funcia competent caut o structur FILE disponibil n tabloul precedent evocat. Adresa acestei
variabile structurate este afectat la un pointer ad.hoc, aa ca fp. Toate accesele ulterioare se vor
face prin intermediul acestui pointer.
Imaginea urmtoare ilustreaz conexiunea ntre un program i un fiier la care accedeaz
programul:
Structurile
FILE
Pointer spre tampon
Poiter spre caracterul
urmtor n tampon
Numrul de acractere
n tampon
Descriptor

Pointer
FILE

Program

Scierea
Citirea
tampon

Deschiderea fisierelor
nainte ca un program s poat manipula un fiier , el trebuie s nceap prin a-l deschide.
Deschiderea unui fiier pentru programul dat const prin a deschide un acces cu ajutorul
sistemului de exploatare :n caz de reuit el va aciona aranjnd ntr-o structur FILE n vederea
operaiilor ulterioare asupra fiierului . Toate aceste aciuni sunt efectuate prin funcia predefinit
fopen.
Iat prototipul funciei:
FILE *fopen (char * nume_fiier ,char* mod_ acces )
Fopen returneaz efectiv pointerul spre tipul FILE .Acest pointer o ntoarce spre structur n
care funcia aranjeaz informaiile coninute n fiierul deschis. Parametrul nume_fiier este un
pointer spre irul de caractere ce conine numele fiierului coninut. Parametrul mod_acces este
un pointer spre irul de caractere , care indic natura operaiilor pe care programul va trebui s-l
execute dup deschiderea fiierului. S presupunem c se dorete s se deschid un fiier .

Trebuie de nceput prin definirea pointerului FILE: FILE */ definete un pointer FILE */
Pentru a efectua operaia propriu-zis:
Fp=fopen (xyz,dat, r): /* deschide fiierul */
Dac ea reuete , adresa structurii FILE coninnd informaiile relative fiierului este afectat
de pointerul Fp
Dac fiierul nu-l va gsi n repertoriul indicat , funcia fopen se fondeaz pe modelul r . El
returneaz atunci valoarea NULL .
/* open xyz ncearc fiierul xzy.dat */
#include <stdio.h > /* pentru FILE , open , printf */
main () {
FILE fp ; / definete pointerul fiierului */
if (( fp=fopen (xyz.dat, a))==NULL /* ncearc s deschid fiierul */
printf ( eroare : imposibil de deschis fiierul /XYZ:dat /./n);
printf ( fiier / xyz.dat / deschide .n);
n acest exemplu de program funcia fopen nu rentoarce pointerul nul dac fiierul nu exist.
Din contra, fiierul este creat n acest caz n repertoriul curent. Funcia fopen returneaz NULL
dac fiierul nu poate fi deschis printr-o alt cale.

Tipuri de fisiere (text & binare)


Conceptul de fiier-text corespunde la reprezentarea unui fiier sub forma unui ir de linii ;
fiecare din ele fiind compuse dintr-un oarecare numr (0 la n) de caractere i terminnd printr-un
caracter special. Din contra un fiier binar corespunde la un simplu ir de octei .
Un mare numr de sisteme de exploatare (aa ca DOS) disting fiierele texte de cele binare nu
doar la nivel logic , dar i la nivel fizic. Aceste reprezentaii diferite de caracterul de la sfritul
liniei n tampon i n fiier au poziia X. Aceasta se traduce cam complicat , dac fiierul text nu
este manipulat , dar contrariu tratatelor de acces direct . n efect n acest caz conversia
caracterelor de la sfritul liniei nu a avut loc. Coninutul fiierului de tip text , se disting fizic,
deoarece este interpretat ca fiier binar.
Caracterul de la sfritul liniei utilizat de fiiere texte poate pune probleme asupra numerelor
sistemelor. Pentru a deschide un fiier n mod binar trebuie de adugat litera b la irul de
caractere care specific modul su de acces . rb va semnifica c fiierul este deschis n mod binar
i n lectur . Dac stringul care d modul de acces conine un caracter +, atunci b poate s fie
plasat nainte sau dup semnul+.
ntr-un fiier text, toate datele sunt memorate ca iruri de caractere, organizate pe linii, separate
ntre ele prin marcajul sfrit de linie \n .
ntr-un fiier text spaiul de memorare pe disc nu este folosit n mod eficient pentru datele
numerice (astfel ntregul 12345 ocup 5 octei).
ntr-un fiier binar, datele sunt pstrate n formatul lor intern (2 octei pentru int, 4 octei
pentru float, etc).
La fiierele text marcajul de sfrit de fiier (caracterul 0X1A) exist fizic n fiier. La
ntlnirea acestui caracter funcia fgetc() ntoarce EOF (-1). Marcajul de sfrit de fiier se
genereaz de la tastatur prin Ctrl-Z.
n cazul fiierelor binare, marcajul de sfrit de fiier nu exist fizic n fiier, ci este generat de
funcia fgetc().
n MS-DOS (i n Unix), la nivelul liniei de comand intrrile i ieirile standard pot fi
redirectate n fiiere disc, fr a opera nici o modificare la nivelul programului. Astfel:
< redirecteaz intrarea standard ctre fiierul specificat
> redirecteaz ieirea standard ctre fiierul specificat
Fiierul standard de eroare nu poate fi redirectat. Fiierul specificat poate fi:
con pentru consola sistem (tastatura, respectiv ecranul)

prn pentru imprimanta paralel


com1 pentru interfaa serial de date
nume_fiier pentru un fiier disc
NUL pentru perifericul nul.
Exemple:
> test.exe > prn
redirecteaz ieirea programului la imprimant
> test.exe < f1.dat > f2.dat redirecteaz att intrarea ct i ieirea programului

Diferenta dintre fisiere binare si fisiere text


Practic, fiierele text conin informaia stocat sub forma unui ir de caractere (eventual,
pe mai multe linii, dar tim deja c sfritul de linie este i el tot un caracter).
Spre deosebire de ele, fiierele binare stocheaz informaia brut, fr prelucrri exact aa
cum apare ea n memorie (putei s va imaginai c se face fotografia unei poriuni din memoria
RAM, i se scrie n fiier Byte cu Byte, astfel nct poate fi restaurat mai trziu printr-o simpl
copiere napoi n RAM).
Ca de obicei, ambele metode de stocare au avantaje i dezavantaje care indic folosirea uneia
sau a celeilalte n funcie de aplicaie:
Stocarea sub form text are ca principal avantaj formatul human readable al informaiei.
Asta nseamn c oricnd putem s deschidem fiierul ntr-un editor i putem interpreta ce scrie n
el direct, fr a mai avea nevoie de o alt aplicaie. (Exemplu: sursele de C). Dezavantajul este c
informaia text ocup mai mult dect n form binar, i este greu de prelucrat de ctre programe.

Stocarea sub form binar are ca avantaje faptul c datele ocup n medie (nu mereu)
mai puin memorie dect cele n format text, au structur previzibil, dar cel mai important, pot
fi ncrcate direct n memorie. (Exemplu: un binar executabil, care este de fapt imaginea din
care este lansat un proces n execuie). Dezavantajul const n faptul c ele devin complet
neinteligibile pentru oameni (trebuie s le interpretm cu o alt aplicaie pentru a le nelege).

typedef struct Elev{


short int nota1;
short int nota2;
char nume[10];
float medie;
} Elev;
[ ... main() i alte funcii ...]
Elev elev;
elev.nota1 = 7;
elev.nota2 = 10;
elev.medie = (elev.nota1 + elev.nota2) / 2.0;
strcpy(elev.nume, "Cartman");
Sa considerm c avem dou fiiere:
FILE* t = fopen("text.out","w");, n care scriem coninutul acestei structuri n format text
(aa cum am fcut pn acum). Un exemplu de stocare este dat de urmtorul apel:
fprintf(t, "%d %d %f %s\n", elev.nota1, elev.nota2, elev.medie, elev.nume);
n realitate, fiierul arat n memorie astfel:

n primul rnd se observ c numerele nu se reprezint pe un numr previzibil de caractere (ex:


1.1, 10.1, sau 10.333333333) care s depind de tipul de dat.
Pe de alt parte, trebuie s introducem caractere speciale de separaie, ca s ne putem da seama
unde se termin un numr i unde ncepe un altul.
Cel mai important ns, dac am vrea s citim aceste date din fiier, trebuie s interpretm din
nou irul de caractere, s l tiem n segmente (dup spaii) i s transformm bucile individuale
de ir n numere, unde este cazul. Nu v lsai pclii ca n loc de strtok() i atoi() exist scanf().
Cineva tot trebuie s fac munca asta, deci apelnd scanf() de fapt n spate se desfoar mult
efort, care cost timp!
FILE* b = fopen("binar.out","rb");, n care scriem coninutul acestei structuri n format
binar astfel:
fwrite(&elev, sizeof(Elev), 1, b);
n realitate, fiierul arat n memorie astfel:

n acest caz, datele se reprezint pe un numr cunoscut de Bytes (mai exact, dimensiunea
tipului de dat). Dup cum se vede din exemplu, asta nu nseamn mereu c se ocup mai puin
memorie. Cu toate acestea, n mod statistic, datele binare ocup mai puin memorie!
O problem este c dac am vrea s deschidem fiierul pentru a citi aceste date, nu s-ar
nelege mai nimic, pentru c orice editor ar ncerca s transforme fiecare Byte ntr-un caracter pe
care s l afieze pe ecran. Evident, nu se obine ceea ce ne-am dori noi sa vedem. Avem nevoie
de un program care s interpreteze fiierul i s ne arate coninutul din el.
Din nou, cel mai important este c dac am vrea s citim aceste date din fiier, le putem
ncrca direct la adresa unei structuri de tip Elev. n realitate, aceste date nu sunt cu nimic mai
mult dect o "fotografie" a unei poriuni din RAM, astfel nct citirea este de fapt o simpl
copiere.
Funcii de citire i scriere la nivel de octet:
Primul lucru pe care trebuie s l facem pentru a putea folosi un fiier este s l deschidem. n
acest sens, lucrurile stau foarte simplu: trebuie doar s adaugm "b" la irul care specific modul
de deschidere al unui fiier n funcia fopen().
Cteva exemple:
Semnifica Fiiere
Fiiere
ie
binare
text
citire
"rb"
"r"
scriere
"wb"
"w"

adugare

"ab"

"a"

Pentru citire la nivel de octet se folosete funcia fread() definit n headerul <stdio.h>, care
are urmtoarea sintax:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Semnificaia argumentelor este urmtoarea:
void* ptr este un pointer ctre o zon de memorie unde se va face citirea
size_t size reprezint dimensiunea n octei a unui element citit
size_t count reprezint numrul de elemente citite. Elementele vor fi depuse n locaii
consecutive ncepnd de la adresa ptr din memorie
FILE* stream reprezint fluxul (fiierul) din care se face citirea
Pentru scriere la nivel de octet se folosete funcia fwrite() definit n headerul <stdio.h>,
care are urmtoarea sintax:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE * stream );
Semnificaia argumentelor este urmtoarea:
void* ptr este un pointer ctre o zon de memorie unde se vor prelua datele ce trebuie scrise
size_t size reprezint dimensiunea n octei a unui element scris
size_t count reprezint numrul de elemente scrise. Elementele vor fi preluate pentru scriere
din locaii consecutive ncepnd de la adresa ptr din memorie
FILE* stream reprezint fluxul (fiierul) n care se face scrierea
Nu n ultimul rnd, fiierele binare au o proprietate interesant: Am spus c spaiul ocupat de
diverse articole depinde exclusiv de tipul lor de dat. Cu alte cuvinte, dac am vrea s citim al
101-lea numr ntreg dintr-un fiier binar care conine doar numere ntregi, tim sigur c acest
numr ocup Bytes-ii cu numerele 400, 401, 402 i 403 din fiier. (Presupunnd c
sizeof(int)==4. Numerele se schimb dac avem alte arhitecturi cu alte tipuri de date.)
Ar fi foarte convenabil dac am putea sri peste restul fiierului direct la acea locaie de
memorie. n realitate, acest lucru este posibil. Pentru a rezolva aceast problem, C-ul pune la
dispoziie dou funcii:
long int ftell ( FILE * fisier ), ntoarce o valoare care reprezint poziia curent n fiier.
int fseek ( FILE * fisier, long int deplasament, long int fata_de_acest_punct ), sare n fiierul
fisier la poziia obinut prin suma celor doi parametri ntregi. Deplasamentul reprezint un numr
de Bytes peste care se sare, iar punctul faa de care se sare poate fi una din constantele:
SEEK_SET, nceputul fiierului
SEEK_CUR, poziia curent n fiier (salt autorelativ)
SEEK_END, poziia final din fiier (nu adunai valori pozitive :D)
nchiderea fiierelor
Cnd un fiier nu mai servete , el se poate nchide. Legtura sa cu pointerul FILE
corespunztor este ntrerupt. Funcia nivelului nalt competent pentru a nchide un fiier este
fclose .Teoretic s-ar putea de renunat s apeleze explicit fclose n program . Fclose este chemat
automatic la sfritul programului , pentru a nchide toate fiierele nc deschise.
Funcia predefinit fclose admite prototipul:
int fclose (FILE * pointer_fiier );
Ea posed ca parametru un pointer spre tipul FILE . Fclose returneaz valoarea 0 dac a putut
s deschid fiierul ataat la pointer_fiier .
Urmtorul exemplu de program ncearc s deschid un fiier a crui nume e
trecut pe linia de comand .Dac va reui , fiierul este renchis cu ajutorul funciei fclose
/* openclose arat cum se deschide i se nchide un fiier a crui nume a dat pe linia de
comand. */
#include stdio.h /* printf , fopen , close */

#include stdlib.h /* exit */


#define READ r
main(int argc, char *argv )
FI LE *fp;
if (argc! =2) /* un singur parametru admis */

printf(?*=(n sintaxa: opnclose fiier .exit /n);


exit(0);

if ((fp=fopen (argv 1 , READ ))==NULL) /*deschiderea fiierului n citire */


printf(EROARE:imposibil de deschis fiierul %s./n, argv 1 );
else
fclose (fp); /* deschiderea fiierului */
printf (fiierul %s a fost nchis. /n, argv 1 );

Operatii de scriere & citire.
Pentru a citi sau a scrie datele unui fiier , se dispun de funcii analogice a celor care servesc la
prinderea datelor la clavir i la afiarea lor la ecran . Poziia la care se citete sau se scrie ntr-un
fiier este dat de un pointer specific (seek pointer ), utilizat pentru operaiile de lectur i scriere.
Acest pointer este condus de un sistem de exploatare : el semnaleaz poziia de tratare a micrii
ntr-un fiier. Dup fiecare lectur i scriere acest pointer este deplasat. Acest deplasament este
efectuat prin sistem. S presupunem c se citesc trei caractere (pe imaginea urmtoare : A ,B, C)
de un fiier X
SEEK pointer(citirea /scrierea )

Funciile fputc i fgetc permit de a scrie sau de a citi caracterele izolate n fiier.
Iat prototipul funciei fputc : int fputc (intcaracter , FILE pointer _fiier).
Ea transfer un caracter dat ca prim parametru , n fiierul reprezentat prin pointer_fiier.
Tipul caracterului este convertit de int cu unsigned char. Valoarea fputc nu este altceva dect
caracterul scris sau mai bine EOF n caz de eroare .S presupunem c este un pointer ataat la un
oarecare fiier , pointerul coninnd adresa structurii FILE aferente. Deci instrucia :
fputc(A, fp); /* scrierea unui caracter n fiier */
scrie caracterul A n fiierul ataat la fp , la poziia tratamentului curente.
Citirea cu caractere cu ajutorul funciei fgetc
Omologul funciei fputc este funcia fgetc care citete un singur caracter n fiier.
int fgetc (FILE * pointer_fiier); /* prototipul lui fgetc */
Funcia fgetc returneaz caracterul citit sub forma unei valori int. Dac valoarea trimis este
EOF , sfritul fiierului a fost atins sau are o eroare. Valoarea EOF explic de ce caracterul citit
este returnat sub forma valorii int i nu valorii char.

Programul urmtor arat o aplicare elementar cu fgetc i fputc. El scrie n fiier un text
introdus de la tastatur. Numele fiierului este introdus de utilizator .
/* scrie n fiier un text n lungime
introdus de la tastatur, apoi afieaz la cerere.
Operaiile */
/* de I/E n fiier utilizeaz funciile fgetc i fputc.
*/
# include stdio.h
/* fgetc, fputc, getchar , printf */
# include conio.h
/* getche , getch */
# include ctype.h
/* toupper */
# include stdlib.h
/* exit */
#define END 64
/* caractere @ */
main ()
FILE *fp; /* pointer spre structura FILE */
char fillename 81; /* numele fiierului */
int I , repl, rep 2; /* variabila de control */
int c ; /* caracterul tampon */
printf (nregistrarea textului. Numele fiierului */n );
do

printf ( /n Fiier :);


gets (file name);
if (( fp=fopen (filename, r )) !=NULL

printf (Fiierul existent. S-l nlocuiasc (0/n));


repl=getche();
repl=toupper (repl);
if (repl !=0)
fclose
(fp);

else /* fiierul nu mai exist */


break; /*sfritul buclei */
while ( repl==0);
if (fp !=NULL) /* fiier nlocuit ,deci : */
fclose (fp); /* se nchide i se redeschide n scriere */
if ((fp=fopen (filename , w))==NULL

printf(n imposibil de scris n fiier . /n );


exit(1);

printf(/n introducei textul);


while ((c=getchar ()) !=END) /*scie textul n fiier */
fputf (c, fp);
fclose (fp);
/*** afiarea coninutului fiierului **********/
printf (De afiat fiierul (0/n);
rep2=getche(); rep2=toupper (rep2);
if (rep2==o)
if ((fp=fopen (file name, r )) ==NULL)

printf(/n Eroarea deschiderii fiierului. /n);


exit(2);
printf(/n Coninutul fiierului %s :/n , filename);
I=0;
while ((c= fgetc(fp)) !=EOF /*citirea caracterului n fiier */

putchar(c); /* afiarea caracterului */


if (c==/n) /* numrul liniilor */
I++;
If (I==20) /* nou pagin pe toate 20 linii */

printf (/n Intrare pentru pagina urmtoare. ); getch(); I=0;

/* fin while */
fclose (fp); /* fin if rep2==0 */

ntr-un program Turbo C, n afar de fluxurile definite de programator, pot fi utilizate nc


cinci fluxuri predefinite (standard), care sunt deschise automat o dat cu lansarea programului.
Acestea sunt:
stdin - flux de tip text pentru operaia de intrare, asociat consolei (tastaturii);
stdout - flux de tip text pentru operaia de ieire, asociat consolei (ecranului);
stderr - flux de tip text pentru operaia de ieire, asociat ecranului (eroare standard);
stdaux - flux de tip binar pentru operaia de intrare/ieire auxiliar;
stdprn - flux de tip binar pentru operaia de ieire, asociat imprimantei.
Parametrul fnume al funciei este un pointer ctre structura FILE i care constituie un ir de
caractere valid pentru sistemul dat de operare. n particular, acest nume poate s specifice calea
spre fiier care urmeaz a fi deschis. Parametrul mod_ acces este un pointer ctre un ir de
caractere care indic modul n care va fi deschis fiierul respectiv. Valorile posibile ale acestui
parametru sunt prezentate n tabelul urmtor.
Mod
Aciune
" r " Deschide un fiier text pentru citire.
"w" Creeaz un fiier text pentru scriere. Dac fiierul exist, coninutul este distrus.
"a"
Deschide un fiier text pentru scriere la sfrit (adugare). Dac fiierul nu exist, se creeaz.
"rb" Deschide un fiier binar pentru citire.
"wb" Deschide un fiier binar pentru scriere.
"ab" Deschide fiierul binar pentru scriere la sfrit (adugare).
"r+" Deschide un fiier text pentru citire/scriere.
"w+" Creeaz un fiier text pentru citire/scriere. Dac fiierul exist, coninutul este distrus.
"a+" Deschide un fiier text pentru adugare sau creeaz pentru citire/scriere un fiier gol.
"r+b" Deschide un fiier binar care exist pentru citire/scriere.
"w+b" Creeaz un fiier binar gol pentru citire/scriere.
"a+b" Deschide un fiier binar pentru adugare sau creeaz un fiier pentru citire/scriere.
"rt" Deschide un fiier text pentru citire.
"wt" Deschide un fiier text pentru scriere.
"at" Deschide un fiier text pentru adugare.
"r+t" Deschide un fiier text pentru citire/scriere.
"w+t" Deschide un fiier text pentru citire/scriere.
"a+t" Deschide un fiier text pentru adugare sau l creeaz pentru citire/scriere.
Dac operaia de deschidere a fiierului s-a terminat cu succes, funcia fopen() returneaz
un pointer ctre structura FILE asociat cu fiierul. In cazul n care operaia de deschidere se
termin cu eec, funcii fopen() returneaz valoarea NULL (pointerul null). Acest pointer este
definit n fiierul stdio.h.
Dac funcia de deschidere a fiierului fopen() leag fluxul cu un fiier, atunci funcia
fclose() distruge aceast legtur, adic nchide fluxul deschis i golete zona tampon. Prototipul
funciei este: int fclose(FILE*fp);
Aici fp este pointerul returnat de funcia fopen(). Apariia n program a funciei fclose()
conduce la memorarea automat a datelor din zona tampon pe disc, indiferent de faptul dac este
sau nu plin tamponul, i la eliberarea memoriei alocate tamponului i structurii FILE. Funcia
returneaz n cazul operaiei reuite de nchidere a fiierului valoarea 0, iar n caz de eroare valoarea -l (EOF).
Alte funcii de prelucrare a fiierelor i definite n stdio.h sunt:
Funcia
Aciunea funciei
putc()
Scrie un caracterl n fiier.
getc()
Citete un caracter din fiier.
fputs()
Scrie un ir de caractere n fiier.

fgets()
Citete un ir de caractere n fiier.
fseek()
Schimb poziia pointerului n fiier la o nou locaie.
fprintf() nscrierea cu format n fiier.
fscanf()
Citete cu format din fiier.
feof()
ntoarce o valoare diferit de 0, dac s-a ajuns la sfritul fiierului.
fread()
Citete un articol din flux.
fwrite()
nscrie n flux un articol.
rewind() Repoziioneaz pointerul fiierului asociat fluxului la nceput de fiier.
remove() terge fiierul.
Exemple pentru functiile ce opereaza cu fisiere specificate de utilizator:
pentru un caracter:
int getc(FILE *fis);- returneaza un caracter din fisierul precizat convertit la un intreg fara
semn, iar la eroare returneaza EOF
int ungetc(int c, FILE *fis);- inapoiaza caracterul c in fisierul deschis pentru citire
int putc(int c, FILE * fis); - trimite caracterul in fisierul deschis pentru scriere, la eroare
returneaza EOF
pentru un sir de caractere:
char *fgets(char *s, int n, FILE *fis);- citeste maxim n-1 caractere sau pina la '\n' inclusiv, si
le depune in s, adauga la sfirsit '\0' si returneaza adresa sirului. La eroare intoarce valoarea NULL
int fputs(const char *s, FILE *fis); - scrie sirul in fisier, fara caracterul '\0'. La eroare
intoarce EOF.
pentru scriere si citire cu format:
int fscanf (FILE *fis, const char *format [, adresa, ...]); - numarul de adrese trebuie sa
corespunda cu numarul de specificatori de format. Formatul contine - caractere spatii - se sare
peste spatii pina la primul caracter nespatiu - caractere obisnuite - caractere ASCII, mai putin '%',
se trece peste un caracter corespunzator in intrare
specificatorul de format: % [*] [width] type
- se sare peste urmatoarea data
- width - nr. de maxim de caractere ce se citesc
- type - tipul informatiei citite:
- octal , u - fara semn, x,X - hexa
- d - zecimal, l - long, f - float, lf - double,
- e,E- format stiintific, c - char, s - sir
int fprintf (FILE *fis, const char *format [, argum...]); - preia un sir de argumente si le aplica
formatul corespunzator, dupa care le scrie in fisierul dat. Formatul contine - caractere obisnuite,
care apar la fel la iesire
specificatori de format (egal sau mai mic decit numarul de argumente): % [fanion]
[width][.prec] type
fanion - alinierea la dreapta sau stinga, prezenta semnului, etc.
width - numarul minim de caractere ce se afiseaza
prec - precizia
conio.h - functii de intrare, iesire pentru consola
void window(int left, int top, int right, int bottom);- defineste o fereastra text precizata prin
colturile stinga sus, dreapta jos
void clreol( void );- sterge intr-o fereastra text de la cursor pina la sfirsirul liniei
void clrscr( void );- sterge fereastra text activa si muta cursorul in pozitia 1,1
void gotoxy( int x, int y );- muta cursorul la coordonatele date
int wherex( void );- returneaza coordonata curenta x
int wherey( void );- returneaza coordonata curenta y
int getch( void ); - citeste un caracter fara a-l afisa la consola
int getche( void ); - citeste si afiseaza caracterul

int kbhit( void ); - verifica daca a fost apasata o tasta


int putch( int c );- pune un caracter in fereastra text curenta.
stdlib.h - contine tipuri, variabile si functii uzuale
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
Un canal special pentru analiza erorilor
Ieirea erorilor standard ne prezint un fiier special de ieire , destinat pentru recuperarea
mesajelor de eroare .n general ieirea erorilor standard este ataat la ecran , de ieire care
afieaz datele pe monitor spre un alt canal , ieirea standard.
Se dau exemplele urmtoare de variabile:
File * fp;
int I=0;
char eroare n mesaj [ ] =eroare la deschiderea fiierului .;
S-ar putea deci de nlocuit formularea deschiderii fiierului xyz.dat:
if ((fp=fopen (xyz.dat, r))==NULL)
Prin noua scriere :
if ((Fp =fopen (xyz.dat, R))==NULL)
while (eroare mesaj [ i])
fputc(eroare mesaj [I++], stderr);
n acest caz , afiarea masajului eroare nu se face spre funcia stdout, dar stderrr
Afiarea caracterului de caracterul mesaj de eroare prin funcia fput c poate fi puin complicat.
2.4.2 Direciile de intrare i de ieire
Se ntreab dac canalul de ieire rezervat mesajelor erori este ntr-adevr indispensabil. El
este n cazul unde intrrile-ieirile unui program sunt redirijate. I/E standard nu mai sunt
reprezentate de tastatur /ecran , dar de un fiier ordinar. S considerm ,deci, urmtorul exemplu
de program:
/* finout recopie intrarea standard la ieirea standard */
#include <stdio.h> /* fgetc, fputc, feof */
main ()
{ char mesaj [] = /n eroare n citire ./n; int I=0; int c;
while ((c=fgetc (stdin)) !=EOF) fputc(C, stdout );
if (!feof (stdin)) /* eroare n citire */
while (mesaj [i] )
fputc (mesaj [I++], stdout);
2.4.2 Citirea i scrierea n lan
Se cunosc funciile gets i puts care citesc/ scriu un ir de caractere la I/E standard . Funcia
fgets citete un ir de caractere ntr-un fiier .
Iat prototipul fgets: char fgets (char pinter_tampon int numr , FILE pointer_fiier
).
Aici pointer _ bufer trimite buferul utilizat pentru stocarea irului de caractere
citit .pointer_fiier indic pointerul FILE ataat la fiier , pe care trebuie s-l citeasc . Funcia
fgets returneaz un pointer la nceputul buferului coninnd irul de caractere citit. n ceea ce
privete valorii returnate NUL fgets se comporta ca fgets cu EOF: se poate deci de utilizat feof
pentru a verifica dac valoarea returnat semnaleaz o eroare .
Funcia fget citete n fiier un oarecare numr de caractere i le aranjeaz n locul memoriei
prin pointer_tampon, pn ce se produce una din evenimentele urmtoare.
Fgets ntlnete caracterul noii linii, funcia se termin. Iat de ce fgets se pregtete bine la
citirea liniei ntr-un fiier .
3.5
/* Program care, folosind fisierul creat in problema 1, calculeaza si afiseaza:
- -suma maxima depusa, impreuna cu data si numele depunatorului

-numarul depunerilor din fiecare zi, si suma totala depusa in fiecare zi, tinand cont ca
tranzactiile dintr-o zi sunt contigue in fisier. */

#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#define MAX 3
typedef struct {
int zi; int luna; int an; } DATA;
typedef struct { unsigned char nume[30]; DATA dat; int sum; } CLIENT;
void main() { CLIENT bd[MAX]; int j,sm,i,smax,ni; FILE *baza;
baza=fopen("date.dat","r"); fread( bd, sizeof( CLIENT ), MAX, baza ); fclose( baza );
smax=0;
for(i=0;i<MAX;i++) {
if (smax<bd[i].sum) { smax=bd[i].sum; ni=i; } }
printf("\n %s , %d-%d-%d , %d \n",bd[ni].nume, bd[ni].dat.zi, bd[ni].dat.luna, bd[ni].dat.an,
bd[ni].sum);
j=1; sm=bd[0].sum;
for (i=1;i<MAX;i++) {
if (bd[i].dat.zi==bd[i-1].dat.zi && bd[i].dat.luna==bd[i-1].dat.luna && bd[i].dat.an==bd[i1].dat.an)
{ j=j+1; sm=sm+bd[i].sum; } else {
printf(" \n Nr. depuneri din data %d-%d-%d = %d ; Suma depusa = %d ",bd[i-1].dat.zi,bd[i1].dat.luna,bd[i-1].dat.an,j,sm);
j=1; sm=bd[i].sum;} }
printf(" \n Nr. depuneri din data %d-%d-%d = %d ; Suma depusa = %d ",bd[i-1].dat.zi,bd[i1].dat.luna,bd[i-1].dat.an,j,sm);
printf("\n \n"); }

4.10
De multe ori trebuie s introducem datele nu de la tastatur, dar dintr-un fiier, i nu s se
afieze rezultatul pe ecran, dar de nscris n fiier. Urmtorul exemplu prezint simplu cum
organizeaz un program lucrul cu fiiere:
/*
* Filel.c
* Acest program demonstreaz utilizarea C acestora pentru :

*Intrarea i ieirea datelor. Programul citete valoarea variabilii.


* Fiier Forder_price customer.dat, calculeaz valoarea variabilei
* Fbilling_price i scrie ntr-un fiier billing.dat.
*/
Fiecare dosar n program corespunde un pointer de fiier tip. Structura fiierului, aa cum
este descris n biblioteca stdio.h, contine tot felul de informaii despre fiierul, inclusiv
numele calea i atributele. n urmtoarea declaraie creeaz fiier doi pointeri:
FILE * fin, * Fout;
Urmtoarele dou linii de dosarul deschis pentru citire i scriere, respectiv:
fin = fopen ("customer.dat", "r"); Fout = fopen ("billing.dat", "w");
Fiecare fopen () funcie returneaz un pointer fiier iniializat. n timpul executrii
valorile de rulare nu ar trebui modificate manual.
Al doilea parametru al funciei fopen (} determin modul de acces. Fiierul poate
fi deschis n urmtoarele moduri: text (activat prin adugarea simbol t) i binar (activat
prin adugarea simbolul b).
Modul text: compilatorul C n timpul introducerii datelor nlocuiete perechea de caractere
carriage return i line cu un singur caracter din linie nou. n derivarea se face
transformare invers. n fiiere binare, aceste caractere nu pot fi procesate.

#include <stdio.h>
#include <conio.h>
#define MIN_DISCOUNT .97
#define MAX_DISCOUNT .95
void main()
{ float frPrice, fbPrice; FILE *fin, *fout; fin = fopen("customer.dat", "r"); fout =
fopen("billing.dat", "w");
if (fin == NULL)
{ printf("Fisierul CUSTOMER.DAT nu exista!");
getch();
return; }
while (fscanf(fin, "%f", &frPrice) != EOF)
{ if (frPrice < 100) fbPrice = frPrice * MIN_DISCOUNT;
else
fbPrice = frPrice * MAX_DISCOUNT;
fprintf(fout, "Suma $%8.2f ", frPrice); printf("Suma $%8.2f ",frPrice); fprintf(fout, "cu rabat e $
%8.2f\n", fbPrice);
printf("cu rabat e $%8.2f\n", fbPrice); } printf("\nDatele de mai sus au fost salvate");
printf(" in fisierul BILLING.DAT!"); getch();
}

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