P. 1
Cursuri c++

Cursuri c++

|Views: 1|Likes:
Published by Scott Barr

More info:

Published by: Scott Barr on Apr 06, 2014
Copyright:Traditional Copyright: All rights reserved

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

07/22/2015

pdf

text

original

CAPITOLUL 8

Fişiere

FIŞIERE
8.1. Caracteristicile generale ale fişierelor 8.2. Desc iderea unui fişier 8.3. $nc iderea unui fişier 8.4. Prelucrarea fişierelor te't 8.4.1. Prelucrarea la nivel de caracter 8.4.2. Prelucrarea la nivel de cuv/nt

8

8.4.3. Prelucrarea la nivel de şir de caractere 8.4.4. Intr!ri"ieşiri for#atate 8.%. Intr!ri"ieşiri &inare 8.(. Po)i*ionarea +ntr,un fişier 8.-. Func*ii utilitare .entru lucrul cu fişiere 8.8. 0lte o.era*ii cu fişiere

8.1. C0R0C1ERI21ICI3E 4E5ER03E 03E FIŞIERE36R
Noţiunea de fişier desemnează o colecţie de informaţii memorată pe un suport permanent (de obicei discuri ma netice!" percepută ca un ansamblu" căreia i se asociază un nume (#n $ederea conser$ării %i re ăsirii ulterioare!& Caracteristicile unui fişier (sub sistem de operare '()*O(! sunt +  *ispoziti$ul lo ic de memorare (discul!,  Calea (#n structura de directoare! unde este memorat fi%ierul,  Numele %i e-tensia,  Atributele care determină operaţiile care pot fi efectuate asupra fi%ierului (de e-emplu+ R)read)onl. ) citire, W)/rite)onl. scriere, RW)read)/rite citire0scriere, H)1idden ) nu se permite nici măcar $izualizarea, S)s.stem ) fi%iere sistem asupra cărora numai sistemul de operare poate realiza operaţii operaţii" etc&!& 3ucrul cu fişiere +n .rogra#are oferă următoarele a$anta2e+  Prelucrarea de unei cantităţi mari de informaţie obţinută din di$erse surse cum ar fi e-ecuţia prealabilă a unui alt pro ram,  (tocarea temporară pe suport permanent a informaţiei #n timpul e-ecuţiei unui pro ram pentru a e$ita supra#ncărcarea memoriei de lucru,  Prelucrarea aceleea%i colecţii de informaţii prin mai multe pro rame& 3n limba2ul C" operaţiile asupra fi%ierelor se realizează cu a2utorul unor funcţii din biblioteca standard (stdio.h!& Transferurile cu dipoziti$ele periferice (tastatură" monitor" disc" imprimantă" etc&! se fac prin intermediul unor dispoziti$e lo ice identice numite strea#,uri (flu-uri! %i prin intermediul sistemului de operare& Un flu' de date este un fi%ier sau un dispoziti$ fizic tratat printr)un pointer la o structură de tip FI3E (din 1eader)ul stdio.h!& C4nd un pro ram este e-ecutat" #n mod automat" se desc1id următoarele flu-uri de date predefinite" dispoziti$e lo ice (#n stdio&1!+  stdin (standard input de$ice! ) dispoziti$ul standard de intrare (tastatura! ) AN(II C,  stdout (standard output de$ice! ) dispoziti$ul standard de ie%ire (monitorul! ) AN(II C,  stderr (standard error output de$ice! ) dispoziti$ul standard de eroare (de obicei un fi%ier care conţine mesa2ele de eroare rezultate din e-ecuţia unor funcţii! ) AN(II C,  stdaux (standard au-iliar. de$ice! ) dispoziti$ul standard au-iliar (de obicei interfaţa serială au-iliară! ) specifice '()*O(,  stdprn (standard printer! ) dispoziti$ul de imprimare ) specifice '()*O(& 3n abordarea limba2ului C (impusă de stdio. !" toate elementele care pot comunica informaţii cu un pro ram sunt percepute ) #n mod unitar ) ca flu-uri de date& *atele introduse de la tastatură formează un fişier de intrare (fişierul standard de intrare)& *atele afi%ate pe monitor formează un fişier de ieşire (fişierul standard de ieşire)& (f4r%itul oricărui fi%ier este indicat printr)un marca2 de sfârşit de fişier (end of file!& 3n cazul fi%ierului standard de intrare" sf4r%itul de fi%ier se enerează prin Ctrl+Z (^Z! (sub '()*O(! (sau Ctrl+D sub Linu-!& Acest caracter poate fi detectat prin folosirea constantei simbolice EOF (definită #n
556

h!" care are $aloarea -1& Această $aloare nu rămane $alabilă pentru fi%ierele binare" care pot conţine pe o poziţie oarecare caracterul ’\x1A’& *e obicei" sc1imbul de informaţii dintre pro rame %i periferice se realizează folosind zone tampon& O zonă tampon păstrează una sau mai multe #nre istrări& Prin operaţia de citire" #nre istrarea curentă este transferată de pe suportul e-tern #n zona tampon care #i corespunde" pro ramul a$4nd apoi acces la elementele #nre istrării din zona tampon& 3n cazul operaţiei de scriere" #nre istrarea se construie%te #n zona tampon" prin pro ram" fiind apoi transferată pe suportul e-tern al fi%ierului& 3n cazul monitoarelor" #nre istrarea se compune din caracterele unui r4nd& *e obicei" o zonă tampon are lun imea multiplu de 758 octeţi& Orice fi%ier trebuie deschis inainte de a fi prelucrat" iar la terminarea prelucrării lui" trebuie închis& 9lu-urile pot fi de tip te't sau de tip &inar& 9lu-urile de tip te-t #mpart fi%ierele #n linii separate prin caracterul :. Parametrul mod este o constantă %ir de caractere" care poate conţine caracterele cu semnificaţiile+ 55> .  citirea dintr-un fişier.  poziţionarea într-un fişier. " asociază referinţei la un fi%ier un strea# (flu.  scrierea într-un fişier.n: (ne/line<linie nouă!" put4nd fi citite ca orice fi%ier te-t& 9lu-urile de tip binar transferă blocuri de octeţi (fără nici o structură!" neput4nd fi citite direct" ca fi%ierele te-t& Prelucrarea fi%ierelor se poate face la două niveluri+  Ni$elul superior de prelucrare a fi%ierelor #n care se utilizează funcţiile specializate #n prelucrarea fi%ierelor&  Ni$elul inferior de prelucrare a fi%ierelor #n care se utilizează direct facilităţile oferite de sistemul de operare" deoarece" #n final" sarcina manipulării fi%ierelor re$ine sistemului de operare& Pentru a a$ea acces la informaţiile despre fi%ierele cu care lucrează" sistemul de operare folose%te c4te un descriptor (bloc de control! pentru fiecare fi%ier& Ca urmare" e-istă două abordări #n pri$inţa lucrului cu fi%iere+  abordarea implementată #n stdio. (input0output 1eader! asociază referinţei la un fi%ier un a%a)numit andle (#n cele ce urmează acesta $a fi tradus prin indicator de fi%ier! care din punct de $edere al tipului de date este in7 (copul lucrului cu fi%iere este acela de a prelucra informaţia conţinută& Pentru a putea accesa un fi%ier $a trebui să)l asociem cu unul din cele două modalităţi de manipulare& Acest tip de operaţie se mai nume%te desc1idere de fi%ier& 3nainte de a citi sau scrie #ntr)un fi%ier (neconectat automat pro ramului!" fi%ierul trebuie desc1is cu a2utorul funcţiei fopen din biblioteca standard& 9uncţia prime%te ca ar ument numele e-tern al fi%ierului" ne ociază cu sistemul de operare %i retunează un nume (identificator! intern care $a fi utilizat ulterior la prelucrarea fi%ireului& Acest identificator intern este un pointer la o structură care conţine informaţii despre fi%ier (poziţia curentă #n buffer" dacă se cite%te sau se scrie #n fi%ier" etc&!& Utilizatorii nu trebuie să cunoască detaliile" sin ura declaraţie necesară fiind cea pentru pointerul de fi%ier& Exemplu: FILE *fp.de date!" un pointer către o structură FI3E&  abordarea definită #n 1eader)ul io. !& FILE *fopen(const char *nu e!fi"ier# const char * od$.de date #ntre fi%ierul specificat prin numele e-tern ( nume_fişier! %i pro ramul C& Parametrul mod specifică sensul flu-ului de date %i modul de interpretare a acestora& 9uncţia returnează un pointer spre tipul 9IL=" iar #n caz de eroare ) pointerul N !! (prototip #n stdio. Operaţiile care pot fi realizate asupra fi%ierelor sunt+  deschiderea unui fişier.2. 8.  închiderea unui fişier. DE2C8IDERE0 959I FIŞIER  Func*ia fopen Crează un flu.CAPITOLUL 8 Fişiere fi%ierul stdio.

"r+b" ? citire0scriere binară&    Func*ia freopen :stdio.de intrare sau ie%ire la unul de intrare0ie%ire. !& int creatne%(const char *nu e!fi"ier# int od$. .citire %i scriere O!C.adău are la sf4r%itul fi%ierului O!1E31 .permisiune de scriere din fi%ier" e$entual le ate prin operatorul ABC& Func*ia creat Crează un fi%ier nou sau #l suprascrie #n cazul #n care de2a e-istă& @eturnează indicatorul de fi%ier sau )5 (#n caz de e%ec!& Parametrul un_mod este obţinut #n mod analo celui de la funcţia de desc1idere (prototip #n io. operaţii de scriere %i citire asupra unui fi%ier desc1is #n condiţiile r" / sau a&  ' + date binare.E01 . !& int open(const char *nu e!fi"ier# int acces )#int od*$. "wb" ? scriere binară. % + flu. desc1idere pentru citire.DO-L. . !& FILE*freopen(const char*nu e!fi"#const char* od#FILE *flu(!date$. desc1idere pentru scriere (crează un fi%ier nou sau suprascrie conţinutul anterior al fi%ierului e-istent!. "rb" ? citire binară. Func*ia o.de date de intrare.nici o interpretare&" @estricţiile de mod de creare se realizează cu a2utorul constantelor+ 5!I. !& int creat(const char *nu e!fi"ier# int un! od$.de date de ie%ire.permisiune de citire din fi%ier 5!I/. .I1E .h oferă un alt tip de control la ni$elul comunicării cu ec1ipamentele periferice (furnizat de funcţia ioctrl!" asupra căruia nu $om insista" deoarece desfă%urarea acestui tip de control este mai reoaie" dar mai profundă& 557 . Func*ia creatne% Crează un fi%ier nou" conform modului specificat& @eturnează indicatorul fi%ierului nou creat sau rezultat de eroare ()5!" dacă fi%ierul de2a e-istă (prototip #n io. O!/. Asociază un nou fi%ier unui flu.en *esc1ide fi%ierul specificat conform cu restricţiile de acces precizate #n apel& @eturnează un #ntre care este un indicator de fi%ier sau )5 (#n caz de e%ec! (prototip #n io.de date de ie%ire cu scriere la sf4r%itul fi%ierului" adău are" sau crearea fi%ierului #n cazul #n care acesta nu e-istă.O-L.CAPITOLUL 8 Fişiere r + flu.    *upă cum se obser$ă" informaţia furnizată pentru desc1iderea unui fi%ier este aceea%i #n ambele abordări" diferenţa const4nd în tipul de date al entitaţii asociate fi%ierului& Implementarea din io.  t + date te-t (modul implicit!& Exemple: "r+" ? desc1idere pentru modificare (citire %i scriere!.E0D ..  a + flu. @estricţiile de acces se precizează prin aplicarea operatorului + (dis2uncţie lo ică la ni$el de bit! #ntre anumite constante simbolice" definite #n fcntl.  & + e-tinde un flu. .creare O!022E-D . .D/. "w+" ? desc1idere pentru modificare (citire %i scriere!.interpretare C@)L9 O!4I-0.h" cum sunt + O!.citire.scriere O!.de date de2a e-istent" #nc1iz4nd le ătura cu $ec1iul fi%ier %i #ncerc4nd să desc1idă una nouă" cu fi%ierul specificat& 9uncţia returnează pointerul către flu-ul de date specificat" sau NULL #n caz de e%ec (prototip #n stdio.

pf ? este pointerul spre tipul !L" a cărui $aloare a fost returnată de funcţia fopen& 9uncţia put# returnează $aloarea lui # ($aloarea scrisă #n caz de succes!" sau ?5 ( "$ ! #n caz de eroare sau sf4r%it de fi%ier&  Func*ia 7etc int 7etc (FILE *pf$. 9uncţia #nc1ide un fi%ier desc1is cu fopen %i eliberează memoria alocată (zona tampon %i structura !L"!& @eturnează $aloarea D la #nc1iderea cu succes a fi%ierului %i )5 #n caz de eroare (prototip #n stdio. PRE39CR0RE0 959I FIŞIER 30 5I=E3 DE C0R0C1ER 9i%ierele pot fi scrise %i citite caracter cu caracter folosind funcţiile putc (pentru scriere! %i 7etc (citire!&  Func*ia putc int putc (int c# FILE *pf$. # ? este codul A(CII al caracterului care se scrie #n fi%ier. PRE39CR0RE0 FIŞIERE36R 1E<1 *upă desc1iderea unui fi%ier" toate operaţiile asupra fi%ierului $or fi efectuate cu pointerul său& Operaţiile de citire %i scriere #ntr)un fi%ier te-t pot fi+  intrări0ie%iri la ni$el de caracter (de octet!. !&  Func*ia close int close(int indicator$.  intrări0ie%iri de %iruri de caractere. !&  Func*ia fcloseall int fcloseall(6oid$. 3nc1ide un indicator de fi%ier %i returnează D (#n caz de succes! sau )5 #n caz de eroare (prototip #n io.3.4. !& 8. 3nc1ide toate flu-ururile de date %i returnează numărul flu-urilor de date #nc1ise (prototip #n stdio.CAPITOLUL 8 Fişiere 8.  intrări0ie%iri cu formatare& Comunicarea de informaţie de la un fi%ier către un pro ram este asi urată prin funcţii de citire care transferă o cantitate de octeţi (unitatea de măsură #n cazul nostru! din fi%ier #ntr)o $ariabilă)pro ram pe care o $om numi buffer" ea #nsă%i a$4nd sensul unei #n%iruiri de octeţi prin declaraţia 6oid *'uf& Comunicarea de informaţie de la un pro ram către un fi%ier este asi urată prin funcţii de scriere care transferă o cantitate de octeţi dintr)o $ariabilă)pro ram de tip buffer #n fi%ier& 9i%ierele sunt percepute #n limba2ul C ca fiind" implicit" sec$enţiale (informaţia este parcursă succesi$" element cu element!& Pentru aceasta" at4t flu-urile de date c4t %i indicatorii de fi%ier au asociat un indicator de poziţie curentă #n cadrul fi%ierului& Acesta este iniţializat la D #n momentul desc1iderii" iar operaţiile de citire" respecti$ scriere" se referă la succesiunea de octeţi care #ncepe cu poziţia curentă& Operarea asupra fiecărui octet din succesiune determină incrementarea indicatorului de poziţie curentă& 8. $5C8IDERE0 959I FIŞIER  Func*ia fclose int fclose(FILE *pf$. 9uncţia cite%te un caracter dintr)un fi%ier (pointerul spre tipul !L" transmis ca ar ument! %i returnează caracterul citit sau "$ la sf4r%it de fi%ier sau eroare& 55E .  intrări0ie%iri la ni$el de cu$4nt (8 octeţi!.4.1.

i.. 8.fopen*"f_#ar:.NULL+ .i.4.txt #n citire if*pf#ar. Exerciţiu: (ă se scrie un pro ram care cite%te un fişier te't" caracter cu caracter" %i afi%ează conţinutul acestuia& %in#&ude 'stdio."5n "roare des#hidere fişier 5n"0 pf#ar.<et#*stdin++ =. (e recomandă utilizarea funcţiei feof pentru a testa #nt4lnirea sf4r%itului de fi%ier& Exemplu: int tab3://40 !L" 1pf0 00 & & & desc1idere fi%ier whi&e *=feof*pf++.<et#*pf#ar++=.i.NULL+ .h( %in#&ude 'pro#ess.CAPITOLUL 8 Fişiere Exerciţiu: (ă se scrie un pro ram care crează un fişier te't #n care se vor scrie caracterele introduse de la tastatură (citite din fi%ierul standard de intrare!" p4nă la #nt4lnirea caracterului FG < CtrlHG& %in#&ude 'stdio. int #.h( %in#&ude 'pro#ess.txt"-"r"+0 00desc1iderea fi%ierului numit f_#ar:. "$ + put#*#-pf#ar+0 00 scrierea caracterului #n fi%ier f#&ose*pf#ar+0 00 #nc1iderea fi%ierului ."$ + 00citire din fi%ier" la ni$el de caracter put#*#-stdout+0 00scrierea caracterului citit #n fi%ierul standard de ie%ire (afi%are pe monitor! f#&ose*pf#ar+0 ./0 i'://0 i+++.txt"-"w"+0 00 crearea fi%ierului cu numele e-tern f_#ar:.h( )oid main*+ . int #. for *int i.fopen*"f_#ar:.whi&e**#.2./0 !L" 1pf#ar0 #har eroare34.<et#har*++=."5n "roare des#hidere fişier 5n"0 whi&e*mesa23i4+ put#har*mesa23i++4+0 pf#ar./0 !L" 1pf#ar0 #har mesa234.."5n!ntrodu #ara#tere urmate de 6tr&+7 *6tr&+8 sub Linux+95n"0 #har eroare34. PRE39CR0RE0 959I FIŞIER 30 5I=E3 DE C9=>51 9uncţiile put% %i 7et% (put/ord %i et/ord! sunt ec1i$alente cu funcţiile put# %i <et#" cu diferenţa că unitatea transferată nu este un sin ur octet (caracter!" ci un cu$4nt (un int!& int 7et%(FILE *pf$. i.txt if*pf#ar. int putc (int %# FILE *pf$.h( )oid main*+ ./0 whi&e*eroare3i4+put#*eroare3i++4-stdout+0 exit*:+0 ./0 whi&e*eroare3i4+put#*eroare3i++4-stdout+0 exit*:+0 . whi&e**#."$ + 00 sau+ whi&e **#. if *feof*pf++ brea>0 55I .

h( )oid main*+ .txt"-"w"+0 00desc1iderea fi%ierului f_şir.fopen*"f_sir.f<ets*sir-n-stdin+0 00 citirea %irurilor din fi%ierul standard de intrare whi&e*psir=.4.f<ets*sir-n-pfsir+0 whi&e*psir=. printf*"Sfarşit de fişier5n"+0 8.h( )oid main*+ .NULL+ ."5n!ntrodu siruri #ar.@A/0 !L" 1pfsir0 #har mesa234.txt"-"r"+0 psir.CAPITOLUL 8 tab3i4.f<ets*sir-n-stdin+0 . int n. PRE39CR0RE0 959I FIŞIER 30 5I=E3 DE ŞIR DE C0R0C1ERE 3ntr)un fi%ier te-t" liniile sunt considerate ca linii de te-t separate de sf4r%itul de linie ( ?5n?!" iar #n memorie" ele de$in %iruri de caractere terminate de caracterul nul ( ?5/?!& Citirea unei linii de te-t dintr)un fi%ier se realizează cu a2utorul funcţiei fgets" iar scrierea #ntr)un fi%ier ) cu a2utorul funcţiei f. 9uncţia cite%te ma-imum dim-: octeţi (caractere! din fi%ier" sau p4nă la #nt4lnirea sfar%itului de linie& Pointerul spre zona #n care se face citirea caracterelor este s& Terminatorul null (?5/?! este plasat automat la sf4r%itul %irului (buffer)lui de memorie!& 9uncţia returnează un pointer către buffer)ul #n care este memorat %irul de caractere" #n caz de succes" sau pointerul NULL #n cazul e%ecului& Exerciţiu: (ă se scrie un pro ram care crează un fi%ier te-t #n care se $or scrie %irurile de caractere introduse de la tastatură& %in#&ude 'stdio. .<etw*pf+0 Fişiere 00citire din fi%ier la ni$el de cu$4nt %i memorare #n $ectorul tab "" . 9uncţia scrie un %ir de caractere #ntr)un fi%ier %i prime%te ca ar umente pointerul spre zona de memorie (buffer)ul! care conţine %irul de caractere ( s! %i pointerul spre structura !L"& 9uncţia returnează ultimul caracter scris" #n caz de succes" sau )5 #n caz de eroare&  Func*ia f7ets char *f7ets(char *s# int di # FILE *pf$. Exerciţu: (ă se scrie un pro ram care cite%te un fi%ier te-t" linie cu linie" %i afi%ează conţinutul acestuia %in#&ude 'stdio. .fopen*"f_sir.@A/0 !L" 1pfsir0 #har sir3@A/4-1psir0 pfsir. .uts& 9uncţia f<ets este indentică cu funcţia <ets" cu deosebirea că funcţia ets cite%te din fi%ierul standard de intrare (stdin!& 9uncţia fputs este indentică cu funcţia puts" cu deosebirea funcţia puts scrie #n fi%ierul standard de ie%ire (stdout!&  Func*ia fputs int fputs(const char *s# FILE *pf$.urmate de 6tr&+7*6tr&+8 sub Linux+95n"0 #har sir3@A/4-1psir0 fputs*mesa2-stdout+0 pfsir. 558 . . fputs*sir-pfsir+0 00 scrierea #n fi%ierul te-t psir.NULL+ .txt pentru scriere psir.3. f#&ose*pfsir+0 . int n.

4. . 00sau+ puts*sir+0 00afi%area (scrierea #n fi%ierul standard de ie%ire! %irului (liniei! citit din fi%ierul te-t psir. . .  Func*ia read Cite%te dintr)un fi%ier (precizat prin indicatorul său" indi#ator! un număr de n octeţi %i #i memorează #n bufferul buf& 9uncţia returnează numărul de octeţi citiţi efecti$ (pentru fi%ierele desc1ise #n mod te-t nu se numără simbolurile de sfir%it de linie!" sau )5 #n caz de eroare (prototip #n io.4. . !& int read(int indicator# 6oid *'uf# unsi7ned n$. f#&ose*pfsir+0.CAPITOLUL 8 Fişiere . !& si8e!t f%rite(const 6oid *'uf# si8e!t di # si8e!t n# FILE *fl(!date$. Func*ia %rite (crie #ntr)un fi%ier (desemnat prin indicatorul său" indi#ator! un număr de n octeţi preluaţi dintr)un buffer (buf este pointerul spre acesta!& @eturnează numărul de octeţi scri%i efecti$ sau )5 #n caz de 55J  . %uncţiile de scriere 9i%ierele or anizate ca date binare pot fi prelucrate cu a2utorul funcţiilor fread %i f&rite. I51R?RI"IEŞIRI F6R@0101E Operaţiile de intrare0ie%ire formatate permit citirea" respecti$ scrierea #ntr)un fi%ier te-t" impun4nd un anumit format& (e utilizează funcţiile fscanf %i fprintf" similare funcţiilor s#anf %i printf (care permit citirea0scrierea formatată de la tastatură0monitor!&  9uncţia fscanf int fscanf(FILE *pf# const char *for at# .on" un număr de articole care se presupune că au o lun ime fi-ă&  Func*ia f%rite (crie informaţia (preluată din buffer" buf este pointerul spre zona tampon care conţine articolele citite! #ntr)un flu.$. 9uncţia fprintf int fprintf(FILE *pf# const char *for at# .$. !& si8e!t fread(6oid *'uf# si8e!t di # si8e!t n# FILE *flu(!date$. 9uncţiile primesc ca parametri fic%i pointerul ( pf ! spre tipul !L" (cu $aloarea atribuită la apelul funcţiei fopen!" %i specificatorul de format (cu structură identică celui prezentat pentru funcţiile printf %i s#anf!& 9uncţiile returnează numărul c4mpurilor citite0scrise #n fi%ier" sau )5 ( "$ ! #n cazul detectării sf4r%itului fi%ierului sau al unei erori&  8.f<ets*sir-n-pfsir+0 00citirea unei linii de te-t din fi%ier fputs*sir-stdout+0 8.%.de date" sub forma a n entităţi de dimensiune dim& @eturnează numărul de entităţi scrise efecti$" sau )5 #n caz de eroare (prototip #n stdio. 3n acest caz" se consideră că #nre istrarea este o colecţie de date structurate numite articole& La o citire se transferă #ntr)o zonă specială" numită )ona ta#. I51R?RI"IEŞIRI AI50RE @eamintim că flu-urile de tip binar transferă blocuri de octeţi (fără nici o structură!" neput4nd fi citite direct" ca fi%ierele te-t ($ezi para raful 8&5&!& Comunicarea de informaţie dintre un pro ram %i un fi%ier este asi urată prin funcţii de citire0scriere care transferă un număr de octeţi" prin inter#ediul unui $uffer& %uncţiile de citire  Func*ia fread Cite%te date dintr)un flu-" sub forma a n blocuri (entităţi!" fiecare bloc a$4nd dimensiunea dim" #ntr)un buffer (buf!& @eturnează numărul de blocuri citite efecti$" sau )5 #n caz de eroare (prototip #n stdio.

fwrite*Cnr.binar" scriere . #out''"5nNumere&e nenu&e #itite din fişier sunt9"''?5n?0 whi&e**fread*Cbuf. !& 58D .h( int main*+ .h( int main*+ . x. Exerciţu: (ă se scrie un pro ram care crează un fi%ier binar #n care se $or introduce numere reale" nenule& %in#&ude 'iostream. NULL+ .h( %in#&ude 'stdio. NULL+ 00desc1idere flu.CAPITOLUL 8 Fişiere eroare (prototip #n io. 9uncţia deplasează capul de citire0scriere al discului" #n $ederea prelucrării #nre istrărilor fi%ierului #ntr)o ordine oarecare& 9uncţia setează poziţia curentă #n flu-ul de date la n octeţi faţă de referinBE!+ dep&asament ? define%te numărul de octeţi peste care se $a deplasa capul discului. !L" 1f0 doub&e nr0 int x0 if **f.f++. fopen*"test_nrb./+ . 5 ) poziţia curentă a capului (S""F_6UR!.. "0 8. #out''"5n!ntrodu#eBi numere*diferite de /+ terminate #u un /9"''?5n?0 #in((nr0 whi&e*nr=. f#&ose*f+0 return /0 .95 FIŞIER Pe l4n ă mecanismul de poziţionare implicit (asi urat prin operaţiile de citire %i scriere! se pot folosi %i operaţiile de poziţionare e-plicită&  Func*ia fsee9 int fsee9(FILE *pf# lon7 deplasa ent# int referin:a$.:+ 00 funcţia sizeof(buf! care returneaza numarul de octeţi necesari $ariabilei buf& #out''buf''" f#&ose*f+0 #out''?5n?0 return /0 .dat"''?5n?0 return :0 . P6BICI650RE0 $51R.f+0 00scriere #n fi%ier #in((nr0 . !& int %rite(int indicator# 6oid *'uf# unsi7ned n$. !L" 1f0 doub&e buf0 if **f. Exemplu: (ă se scrie un pro ram ce cite%te dintr)un fi%ier binar numere reale" nenule& %in#&ude 'iostream.h( %in#&ude 'stdio.(. #out''"5nNu se poate des#hide fişieru& test_nrb.dat"''?5n?0 return :0 .dat".siDeof*nr+. fopen*"test_nrb."rb"++ . referinBa ? poate a$ea una din $alorile+ D ) #nceputul fi%ierului (S""F_S"G!.:.:."wb"++ . 8 ) sf4r%itul fi%ierului (S""F_"N8!& 9uncţia returnează $aloarea zero la poziţionarea corectă %i o $aloare diferită de zero #n caz de eroare (prototip #n stdio.siDeof*buf+...dat". #out''"5nNu se poate des#hide fişieru& test_nrb.

!& Func*ia fsetpos int fsetpos(FILE *flu(!date# const fpos!t *po8i:ie$. !&  Func*ia tell lon7 tell(int indicator$. @eturnează $aloarea 5 dacă poziţia curentă este sf4r%itul de fi%ier" D dacă indicatorul este poziţionat #n altă parte" sau )5 #n caz de eroare (prototip #n io. @eturnează poziţia curentă a capului de citire0scriere #n fi%ier (e-primată #n număr de octeţi faţă de #nceputul fi%ierului!" sau )5L #n caz de eroare (prototip #n io. (etează poziţia curentă #n flu-ul de date (atribuie indicatorului $aloarea $ariabilei indicate poDiBie!" la o $aloare obţinută printr apelul funcţiei f<etpos& @eturnează $aloarea D #n caz de succes" sau diferită de D #n caz de e%ec (prototip #n stdio. !& 9uncţii de golire a fluxurilor de date  Func*ia fflush int fflush(FILE *flu(!date$. !& Func*ia f7etpos int f7etpos(FILE *flu(!date# fpos!t *po8i:ie$.CAPITOLUL 8  Fişiere Func*ia lsee9 int lsee9(int indicator# lon7 n# int referinta$. @eturnează o $aloare diferită de zero #n cazul #nt4lnirii sf4r%itului de fi%ier sau D #n celelalte cazuri (prototip #n stdio. Indică poziţia curentă a capului de citire #n fi%ier& 9uncţia returnează o $aloare de tip lon int care reprezintă poziţia curentă #n flu-ul de date (deplasamentul #n octeţi a poziţiei capului faţă de #nceputul fi%ierului! sau )5L #n caz de eroare (prototip #n stdio. *etermină poziţia curentă (pointer către o structură" fpos_t" care descrie această poziţie #n flu-ul de date!& 3nscrie $aloarea indicatorului #n $ariabila indicată de poDiBie& @eturnează D la determinarea cu succes a acestei poziţii sau $aloare diferită de zero #n caz de e%ec& (tructura care descrie poziţia poate fi transmisă ca ar ument funcţiei fsetpos (prototip #n stdio. F95CCII 91I3I10RE PE51R9 39CR93 C9 FIŞIERE 9uncţii de testare a sfârşitului de fişier  Func*ia feof int feof(FILE *flu(!date$. Kole%te un flu-ul de date specificat ca ar ument& @eturnează D #n caz de succes %i )5 ( "$ ! #n caz de eroare (prototip #n stdio. !&  Func*ia re%ind 8. !& 585 . Poziţionează indicatorul la #nceputul flu-ului de date specificat ca ar ument (prototip #n stdio. (eteaza poziţia curentă de citire0scriere #n fi%ier la n octeţi faţa de referinBE& @eturnează $aloarea D #n caz de succes %i diferită de zero #n caz de eroare (prototip #n io.-. !& 6oid re%ind(FILE *flu(!date$. !&  Func*ia eof int eof(int indicator$. !&   =-istă funcţii pentru modificarea $alorii indicatorului de poziţie %i de determinare a poziţiei curente a acestuia&  Func*ia ftell lon7 ftell(FILE *pf$.

!&  Func*ia rena e int rena e(const char *nu e!6echi# const char *nu e!nou$. " stdio.(int indicator!6echi# int indicator!nou$. 031E 6PER0CII C9 FIŞIERE 9uncţii care permit operaţii ale sistemului de operare asupra fişierelor  Func*ia re o6e int re o6e(const char *nu e!fi"ier$. !&  9uncţii care permit manipularea aceluiaşi fişier prin două indicatoare de fişier independente  Func*ia dup int dup(int indicator$. *uplică un indicator de fi%ier la $aloarea unui indicator de fi%ier de2a e-istent& @eturnează D #n caz de succes %i )5 #n caz de e%ec (prototip #n io. @eturnează lun imea unui fi%ier (#n octeţi! sau )5 #n caz de eroare (prototip #n io. Lter e un fi%ier& @eturnează D la operaţie reu%ită %i )5 la e%ec. Kole%te toate flu-urile de date e-istente" pentru cele de scriere efectu4nd %i scrierea #n fi%iere& @eturnează numărul de flu-uri asupra cărora s)a efectuat operaţia (prototip #n stdio. !& 9uncţii pentru aflarea sau modificarea dimensiunii în octeţi a fişierelor  Func*ia chsi8e int chsi8e(int indicator# lon7 lun7i e$. Crează un nume unic pentru fi%ierul temporar (prototip #n stdio. !&  Func*ia t pna char *t pna (char *sptr$. !&  Func*ia filelen7th lon7 filelen7th(int indicator$. Lter e un fi%ier& @eturnează $aloarea D pentru operaţie reu%ită %i )5 pentru operaţie e%uată (prototip #n stdio. *esc1ide un fi%ier temporar" ca flu. !&  Func*ia dup.CAPITOLUL 8  Fişiere Func*ia flushall int flushall(6oid$. !& 8.8. @edenume%te un fi%ier& @eturnează D pentru operaţie reu%ita %i )5 #n cazul e%ecului (prototip #n stdio. !& 588 . int dup. 'odifică dimensiunea unui fi%ier" conform ar umentului &un<ime& @eturnează D pentru operaţie reu%ită sau )5 #n caz de e%ec (prototip #n stdio." funcţia nu $a reu%i operaţia (prototip #n io. *uplică un indicator de fi%ier& @eturnează noul indicator de fi%ier pentru operaţie reu%ită sau )5 #n cazul e%ecului (prototip #n io.de date" #n mod binar (w+b!& @eturnează pointerul către fi%ierul desc1is #n cazul operaţiei reu%ite" sau NULL #n caz de e%ec (prototip #n stdio. dacă fi%ierul are permisiune read)onl. !& Func*ia unlin9 int unlin9(const char *nu e!fi"ier$. !& 9uncţii de lucru cu fişiere temporare care oferă facilităţi de lucru cu fi%iere temporare prin enerarea de nume unice de fi%ier #n zona de lucru&  Func*ia t pfile FILE *t pfile(6oid$.

an<a2at a0 !L" 1pf0 #har #ont0#har 1nume_fis0 #out''"Nume fisier #are )a fi #reat9"0 #in((nume_fis0 if **pf..sbinar-:-siDeof*an<a2at+-pf+0 #out''"6ontinuati introdu#erea de date *dNn+ O"0 #in((#ont0 .h( tLpedef stru#t . Exemplu: Aplicaţie pentru estiunea materialelor dintr)un depozit& Aplicaţia $a a$ea un meniu principal %i $a permite estiunea următoarelor informaţii+ codul materialului ($a fi c1iar Nnumărul de ordineN!" denumirea acestuia" unitatea de măsură" preţul unitar" cantitatea contractată %i cea recepţionată ($ectori cu > elemente!& 'emorarea datelor se $a face #ntr)un fi%ier de date (un fi%ier binar cu structuri!" numit Nmaterial&datN& Aplicaţia conţine următoarele funcţii+ 5& he&p*+ ) informare pri$ind opţiunile pro ramului 8& 9uncţii pentru fi%ierele binare" care să suplinească lipsa funcţiilor standard pentru or anizarea directă a fi%ierelor binare+ #itireb*+ ) citire #n acces direct din fi%ier. fopen*nume_fis. Crează un fi%ier unic ca nume" cu atributele specificate #n ar umentul attrib (prin Mfmode'$_G"HG sau $_I!NJRK!" #n directorul dat #n ar umentul #a&e& @eturnează indicatorul (1andler)ul! către fi%ierul creat sau )5 (%i setarea errno! #n cazul e%ecului (prototip #n io. #har nume3@/40int mar#a0doub&e sa&ariu0 . fopen*nume_fis.a:0 if*feof*pf++ exit*:+0 #out''" Mar#a 9 "''a.nume''?5n?0 #out''" Sa&ariu& 9 "''a.mar#a0 #out''"Nume 9 "0#in((a. #out''"5n"roare #itire fişier "''nume_fis''"=5n"0 return :0 .mar#a0 #out''" Nume&e 9 "''a. #out''"5n"roare #reare fişier "''nume_fis''"=5n"0 return :0 .h( %in#&ude 'stdio. whi&e*toupper*#ont+=.a0 fwrite*buffer.nume0 #out''"Sa&ariu 9"0#in((a. fread*buffer.h( %in#&ude '#tLpe.buffer0 int main*+ . f#&ose*pf+0 .. NULL+ . NULL+ ."wb"++ .CAPITOLUL 8  Fişiere Func*ia creatte p int creatte p(char *cale# int attri'$.#out''"Mar#a 9 "0#in((a.a.an<a2at a0#har sbinar3siDeof*an<a2at+40. for*00+ . do .sa&ariu''?5n?0 .an<a2at0 union .sbinar-:-siDeof*a+-pf+0 a. 586 ."rb"++ .sa&ariu0 buffer.buffer. !& Exemplu: (ă se creeze un fi%ier binar" care $a conţine informaţiile despre an a2aţii unei #ntreprinderi+ nume" marca" salariu& (ă se afi%eze apoi conţinutul fi%ierului& %in#&ude'iostream.?N?+0 f#&ose*pf+0 00citirea informatiilor if **pf.

6oid help($ 00 afi%are informaţii despre utilizarea meniului %i opţiunile acestuia . . ) creare fi%ier& 6& 9uncţii pentru adau area" modificarea" %ter erea %i listarea de materiale& s#rieb*+ #itmat*+ afismat*+ &un<fisis*+ #refis*+ %in#&ude 'pro#ess. ) citirea de la terminal a informaţiilor despre un material.#out''""roare de s#riere in fişier ="''?5n?0 58> . lon7 int lun7fis(FILE *f$ 00 returnează lun imea fi%ierului . #har opBiune0 do 00afi%area unui meniu de opţiuni %i selecţia opţiunii .*nr-:+1siDeof*materia&+0 fsee>*f-dep&-S""F_S"G+0 if*fwrite*a-siDeof*materia&+-:-f+=.fte&&*f+0 fsee>*f-posi-S""F_S"G+0 return posf0 .h( %in#&ude 'iostream.&on< int posi-posf0 posi. #out''?5n?''"$pBiunea 8)s.:+ . de &u#ru este"''?5n? ''"*#QaQmQsQ&QeQh pentru he&p+ 9 "0 #in((opBiune0 swit#h*opBiune+ . #ase ?#?9#ase ?6?9#refis*+0brea>0 #ase ?a?9#ase ?J?9adau<*+0brea>0 #ase ?m?9#ase ?M?9modif*+0brea>0 #ase ?s?9#ase ?S?9şter<*+0brea>0 #ase ?&?9#ase ?L?9&ist*+0brea>0 #ase ?h?9#ase ?H?9he&p*+0brea>0 #ase ?e?9#ase ?"?9 brea>0 defau&t9he&p*+0 brea>0 .?"?+0 .h( %in#&ude 'stdio. ) afi%area informaţiilor despre un material (apelată de &ist!.h( tLpedef stru#t materia& .CAPITOLUL 8 Fişiere ) scriere #n acces direct #n fi%ier.0 materia& mat0 !L" 1pf0 )oid #refis*+-adau<*+-modif*+-ster<*+-&ist*+-he&p*+0 6oid ain($ .&on< dep&.fte&&*f+0 fsee>*f-/-S""F_"N8+0 posf.whi&e*toupper*opBiune+=.#out''"$pBiuni&e de &u#ru sunt 9"''?5n?0 #out''" 6-#-#reare fisier"''?5n?0 #out''" J-a-adau<are"''?5n?0 #out''" M-m-modifi#are"''?5n?0 #out''" L-&-&istare"''?5n?0 #out''" S-s-şter<ere"''?5n?0 #out''" H-h-he&p"''?5n?0 #out''" "-e-exit"''?5n?0 . int #odm-sto#-#ant_#3P4-#ant_r3P40 #har den_mat3@/4-unit_mas3P40 f&oat preB0 . ) determinarea lun imii fi%ierului e-istent. 6oid scrie'(int nr#6oid *a#FILE *f$ 00scriere #n fi%ierul binar .h( %in#&ude '#tLpe.

6oid adau7($ 00adău are de noi materiale . e&se #out''"J#est arti#o& a fost şters ="''?5n?0 ./0i'P0i+++ #out''"Re#eptionat "''i''" 9 "''a-(#ant_r3i4''?5n?0 #out''"Sto# 9 "''a-(sto#''?5n?0 #out''"Unitate de masura9 "''a-(unit_mas''?5n?0 #out''"RreB unitar 9 "''a-(preB''?5n?0 . Fişiere 587 . 6oid crefis($ 00desc1idere fisier . 6oid afis at( aterial *a$ 00afi%area informaţiilor despre un anumit material . if**pf.fopen*"materia&.NULL+ #out''" işieru& exista de2a ="''?5n?0 e&se pf. .#odm+ s#rieb*++na-Cmat-pf+0 . . 6oid cit at( aterial *a$ 00citirea informaţiilor despre un anumit material .fopen*"materia&.dat"-"a"+000desc1idere pentru append na.dat"-"r"++=. #out''"!ntrodu#eBi #antitaBi&e re#epBionate 9 "''?5n?0 for*i.#out''"6od materia& 9 "''a-(#odm''?5n?0 #out''"8enumire materia&9 "''a-(den_mat''?5n?0 #out''"6antitaBi #ontra#tate9"''?5n?0 for*i. whi&e*mat. int na0 pf.&un<fis*pf+NsiDeof*materia&+0 do .. ./0i'P0i+++ #out''"6ontra#tat "''i''" 9 "''a-(#ant_#3i4''?5n?0 #out''"6antitaBi re#epBionate9"''?5n?0 for*i.dat"-"w"+0 f#&ose*pf+0 .fopen*"materia&.&on< dep&.*nr-:+1siDeof*materia&+0 fsee>*f-dep&-S""F_S"G+0 if*fread*a-siDeof*materia&+-:-f+=.#itmat*Cmat+0 if*mat.#out''"Re#eptionat "''i+:''" 9 "0#in((a-(#ant_r3i40 .#odm+0 f#&ose*pf+0 ./+ return0 #out''"!ntrodu#eBi denumirea materia&u&ui 9 "0#in((a-(den_mat0 #out''"!ntrodu#eBi unitatea de mEsurE 9 "0#in((a-(unit_mas0 #out''"!ntrodu#eBi preBu& 9 "0#in((temp0a-(preB. 6oid citire'(int nr#6oid *a#FILE *f$ 00citire din fi%ierul binar ./0i'P0i+++ . int i0 if*a-(#odm+ .CAPITOLUL 8 exit*:+0 ."nd+9 "0#in((a-(#odm0 if*a-(#odm.temp0 #out''"!ntrodu#eBi #antitaBi&e #ontra#tate 9 "''?5n?0 for*i. int i0f&oat temp0 #out''"!ntrodu#eti #odu& materia&u&ui */./0i'P0i+++ .:+ .#out''""roare de #itire din fişier ="''?5n?0 exit*@+0 .#out''"6ontra#tat "''i+:''" 9 "0#in((a-(#ant_#3i40 .

Fişiere $51REA?RI ŞI E<ERCICII C estiuni ."N8+9 "0#in((na0 if*na+ ."N8+9 "0#in((na0 if*na+ .toupper*#h+0 . .whi&e*=*n(.whi&e*na+0 f#&ose*pf+0 .fopen*"materia&.whi&e*n+0 f#&ose*pf+0 .&un<fis*pf+NsiDeof*materia&+0 do .na++0 if*n+ s#rieb*n-Cmat-pf+0 .. .fopen*"materia&./0 na.?8? CC #h=.#out''"Numaru& arti#o&u&ui de şters este */.dat"-"r+"+0 mat.dat"-"r"+0 do . int na0 pf.fopen*"materia&. 6oid ster7($ 00%ter erea din fi%ier a unui material . whi&e*#h=.CAPITOLUL 8 6oid odif($ 00modificarea informaţiilor despre un material e-istent ./ CC n'.ractice 5& (crieţi un pro ram de tipărire a conţinuturilor mai multor fi%iere" ale căror nume se transmit ca parametri către funcţia main& Tipărirea se face pe ecran (lun imea pa inii < 88! sau la imprimantă (lun imea pa inii < E5!& Conţinutul fiecărui fi%ier $a #ncepe pe o pa ină nouă" cu un titlu care indică numele fi%ierului& Pentru fiecare fi%ier" pa inile $or fi numerotate (cu a2utorul unui contor de pa ini!& 8& (crieţi un pro ram care cite%te un fi%ier te-t& Pornind de la conţinutul acestuia" se $a crea un alt fi%ier" prin #nlocuirea spaţiilor consecuti$e cu unul sin ur& (e $or afi%a pe ecran conţinutul fi%ierului de la care s)a pornit %i conţinutul fi%ierului obţinut& 58E .?N?+0 if*#h.#out''"Numaru& arti#o&u&ui de &istat este */. .whi&e*na+0 f#&ose*pf+0 .#odm."N8+9 "0#in((n0 if*n'/QQn(na+ #out''"Jrti#o& eronat"''?5n?0 . do .#itireb*na-Cmat-pf+0 afismat*Cmat+0 #out''"Modifi#aBi arti#o& *8NN+ O 9"0 do . #in((#h0 #h.#out''"Numaru& arti#o&u&ui de modifi#at este */. 6oid list($ 00afi%are informaţii despre un anumit material .?8?+ . int n0&on< int na0 pf.#itmat*Cmat+0 s#rieb*na-Cmat-pf+0 .dat"-"r+"+0 do . int na0 #har #h0 pf.#itireb*na-Cmat-pf+0 afismat*Cmat+0 #out''?5n?0 .

i! Numele celei mai $ec1i cărţi din bibliotecă. 2! Numele celei mai scumpe cărţi din bibliotecă. P! Numele autorului cu cele mai multe cărţi. l! Qaloarea totală a cărţilor din bibliotecă& 58I . ! Lter erea unei cărţi din bibliotecă. c! Afi%area informaţiilor despre o anumită carte. e! 'odificarea informaţiilor e-istente. d! Căutarea titlurilor după un anumit autor. f! Lista alfabetică a tuturor autorilor. 1! Ordonarea descrescătoare după anul apariţiei.CAPITOLUL 8 Fişiere 6& (ă se consulte conţinutul unui fi%ier %i să se afi%eze următoarele informaţii statistice+ numărul de cu$inte din fi%ier" numărul de caractere" numărul de linii" numărul de date numerice (nu cifre" numereO!& >& (crieţi un pro ram care să compare conţinutul a două fi%iere" %i afi%aţi primele linii care diferă %i poziţia caracterelor diferite #n aceste linii& 7& (crieţi un pro ram care cite%te conţinutul unui fi%ier sursă scris #n limba2ul C %i afi%ează #n ordine alfabetică fiecare rup al numelor de $ariabile care au primele n caractere identice (n este citit de la tastatură!& E& (crieţi un pro ram care consultă un fi%ier te-t %i afi%ează o listă a tuturor cu$intelor din fi%ier& Pentru fiecare cu$4nt se $or afi%a %i numerele liniilor #n care apare cu$4ntul& I& (crieţi un pro ram care cite%te un te-t introdus de la tastatură %i afi%ează cu$intele distincte" #n ordinea crescătoare a frec$enţei lor de apariţie& La afi%are" fiecare cu$4nt $a fi precedat de numărul de apariţii& 8& (crieţi un pro ram care cite%te un te-t introdus de la tastatură" ordonează alfabetic liniile acestuia %i le afi%ează& J& (crieţi o aplicaţie pentru estiunea informatiilor despre cărţile e-istente #ntr)o bibliotecă& Aplicaţia $a a$ea un meniu principal care $a permite+ a! 'emorarea datelor #ntr)un fi%ier (un fi%ier binar cu structuri!" al cărui nume se introduce de la tastatură& 9i%ierul $a contine informaţiile+ nume carte" autor" editura" anul apariţiei" preţ& Pentru fiecare carte" se $a enera o cotă (un număr unic care să constituie c1eia de căutare!& b! Adau ărea de noi cărţi.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->