Fisiere - POO

download Fisiere - POO

of 9

Transcript of Fisiere - POO

  • 8/15/2019 Fisiere - POO

    1/9

    Fişiere

    Noţiuni generale

    Intr ările şi ieşirile în limbajul C++ sunt implementate cu ajutorul fluxurilor (stream).Fluxurile sunt obiecte care transportă şi formatează şiruri de bytes. Fluxurile pot fiunidirecţionale (de intrare sau de ieşire) sau bidirecţionale (permit şi intr ări şi ieşiri).

    Clasele care reprezintă fluxuri asociate fişierelor sunt definite în biblioteca fstream;aceste clase sunt:

    •  ifstream: flux unidirecţional care permite citirea de date dintr-un fişier•  ofstream: flux unidirecţional care permite scrierea de date dintr-un fişier•   fstream: flux bidirecţional care permite citiri şi scrieri în/din fişier  

    Operaţii de bază 

    Deschiderea fi şierelor

    Deschiderea fişierelor se poate face în două moduri: prin constructor sau prin apelareafuncţiei membru open. Ambele variante primesc ca parametri numele fişierului şiopţiunile de deschidere:

    Varianta folosind constructorul:

     fstream fisier("nume_fisier", optiuni);

    Varianta folosind funcţia open:

     fstream fisier;

     fisier.open("nume_fisier", optiuni);

    Partea cu opţiunile poate lipsi. Pentru clasele istream şi ostream, operaţiunea dedeschidere se efectuează similar. Opţiunile la deschiderea fişierelor se dau prinintermediul următoarelor constante:

    Constantă  Efect

    i os: : i n Deschide un fişier pentru citire. Opţiunea este folosită şi pentru aevita suprascrierea fişierului în cazul în care acesta există.

    i os : : out Deschide un fişier pentru scriere. i os: : app Deschide fişierul pentru adăugare. Toate scrierile se vor face la

    sfâr şitul fişierului.i os : : at e Deschide fişierul şi se poziţionează la sfâr şit.i os : : t r unc Şterge conţinutul fişierului la deschidere (dacă acesta există).i os: : bi nar y Deschide fişierul în mod binar (implicit este text).

    Opţiunile se pot combina folosind operatorul „|”.În cazul în care opţiunile lipsesc,valorile implicite sunt:

    Clasa Opţiuni

  • 8/15/2019 Fisiere - POO

    2/9

    ifstream i os: : i n ofstream i os: : out   fstream i os: : i n | i os: : out  

    Exemple de utilizare:

    / / creaza obi ectul f i s i er pent ru c i t i re/ scr i ere/ / s i deschi de f i s i erul " test . tx t" f ol os i nd/ / constr uctorul s i opt i uni l e i mpl i c i t ef st reamf i si er ( " t est . t xt " ) ;

    / / deschi de f i si er ul pent r u ci t i r e i n mod bi nari f s t r eam f ci t i r e;f ci t i re. open("date.dat" , i os : : i n | i os : : bi nary) ;

    / / deschi de f i si er ul "st udent i . t xt " i n mod t ext pent r u/ / scr i ere l a sf ar s i t ul f i si erul uiof s t ream f scr i ere("st udent i . tx t" , i os : : out | i os : : app) ;  

    Verificarea faptului că un fişier este deschis se poate face folosind funcţia membruis_open(). 

    Închiderea fi şierelor

    Fişierele deschise folosind clasele din fstream sunt închise automat de cătredestructorul clasei. Închiderea fişierului se poate face explicit prin apelul funcţieimembru close; după apelul funcţiei, obiectul poate fi refolosit pentru a accesa altobiect. Exemplu:

    voi d  mai n( ){

    / / deschi dem f i si er ul bi nar "st udent i . dat "

    f st r eamf i s i er ( " student i . dat " , i os : : i n | i os : : bi nary) ;

    / / oper at i i . . .

    / / i nchi demf i s i erulf i si er . cl ose( ) ;

    / / deschi demf i si erul " l i s ta. txt "f i s i er . open( " l i s ta. txt " , i os : : out ) ;

    / / oper at i i . . .

    } / / f i s i erul " l i sta. t xt " este i nchi s aut omat l a/ / di str ugerea obi ectul ui " f i s i er"

    Detectarea erorilor

    Detectarea erorilor apărute se poate face prin intermediul unor funcţii membre aleclaselor:

    Funcţia Descrierebad Întoarce true dacă a apărut o eroare fatală; în acest caz, fluxul nu mai

    este utilizabil.f ai l sau oper at or !

    Ultima operaţie de I/E a eşuat (eroare de conversie, sfâr şitul şirului,fişierul nu poate fi deschis…). Fluxul poate fi utilizat în continuare

    după apelarea funcţiei membru clear(). good Întoarce true dacă nu a apărut nici o eroare şi fişierul nu este la sfâr şit.

  • 8/15/2019 Fisiere - POO

    3/9

    eof Întoarce true dacă fişierul este la sfâr şit.

    În cazul în care se doreşte ştergerea indicatorilor de eroare se poate folosi funcţiaclear.

    Exemplu de utilizare:

    / / deschi dere f i s i erf st r eamf i s i er ( " student i . dat " , i os : : i n | i os : : bi nary) ;

    / / ver i f i carei f   ( ! f i si er ){

    cer r

  • 8/15/2019 Fisiere - POO

    4/9

     / / f i si er ul est e i nchi s aut omat de const r uctorul/ / cl asei of s t ream

    }

    / / I ncar ca di n f i si er un vector sal vat de functi a/ / Sal var eVect or . Pr esupune ca vect or ul pr i mi t ca

    / / par amet r u est e al ocat .voi d  I ncar car eVect or ( i nt   vector[ ] , i nt & n, char * numeFi si er){

    / / deschi dem f i s i erul pent ru c i t i rei f s t ream f i s i er( numeFi s i er) ;

    / / daca f i si er ul a f ost deschi si f   ( f i si er ){

    / / ci t i m numar ul de el ement e di n f i si erf i si er >> n;

    / / ci t i m el ement el e vectorul uif or   ( i nt   i = 0; i < n; i ++)

    f i s i er >> vector[ i ] ;}el se{

    / / af i samun mesaj de eroar ecer r

  • 8/15/2019 Fisiere - POO

    5/9

    get() Citeşte un caracter din fişier.peek( ) Întoarce următorul caracter din fişier f ăr ă să 

    mute indicatorul de poziţionare..put ( char ) Scrie un caracter în fişier.

    Funcţia getline este utilă în special în cazul în care trebuie citite şiruri de caracterecare conţin spaţii (de exemplu nume de persoane):

    #i ncl ude  / / obi ectel e pent r u l ucrul cu consol a#i ncl ude  / / obi ectel e pent r u l ucrul cu f i si er eusi ng  namespace  std;

    / / numarul maxi m de car act ere pent r u un numeconst   i nt   DI M_MAX_NUME = 1024;

    / / numarul maxi m de persoane di n l i st aconst   i nt   NR_MAX_NUME = 1024;

    / / Ci t este o l i sta de per soane di nt r - un f i si er/ / ( cat e un nume pe f i ecar e l i ni e) si i nt oar ce/ / un vector de si r ur i de car actere. Vectorul se/ / presupune nei ni t i al i zat .voi d  Ci t i r eLi st aPer soane( char **& l i s ta, i nt &n, char * numeFi si er){

    / / deschi dem f i s i erul pent ru c i t i rei f s t ream f i s i er( numeFi s i er) ;

    / / daca f i si er ul a f ost deschi si f   ( f i si er ){

    / / al ocamspati u pent r u st ocar ea t emporara a numel uichar   *numeTemp = new  char [ DI M_MAX_NUME] ;

    / / al ocam spat i u pent r u stocar ea t empor ar a a vect or ul uichar   ** l i st aTemp = new  char *[ NR_MAX_NUME] ;

    n = 0;whi l e( ! f i si er . eof ( ) ){

    / / ci t i m numel e di n f i si er ; se f ol oseste separ at or ul/ / i mpl i ci t ( ' \ n' ) ;f i si er . get l i ne( numeTemp, DI M_MAX_NUME);

    / / al ocam spat i ul necesar si i l copi em i n vectori nt   di mNume = ( i nt ) st r l en( numeTemp) ;l i st aTemp[ n] = new  char [ di mNume + 1] ;st r cpy( l i st aTemp[ n] , numeTemp) ;

    n++; / / i ncrement am numarul de per soane}

    / / copi em poi nt er i i di n vector ul t empor ar i n r ezul t atl i sta = new  char * [n ] ;f or   ( i nt   i = 0; i < n; i ++)

    l i s ta[ i ] = l i s taTemp[ i ] ;

    / / deal ocam spat i ul t empor ardel et e  [ ] numeTemp;del et e  [ ] l i st aTemp;

    }el se{

    / / af i samun mesaj de eroar ecerr

  • 8/15/2019 Fisiere - POO

    6/9

      }}

    voi d  mai n( ){

    / / decl ar am var i abi l el e necesar echar   **l i st aPer soane;

    i nt   n;

    / / ci t i m l i s ta de persoane di n f i s i erCi t i r eLi staPer soane( l i staPer soane, n, "persoane. t xt ") ;

    / / af i sam l i sta de per soanef or   ( i nt   i = 0; i < n; i ++)

    cout

  • 8/15/2019 Fisiere - POO

    7/9

      {/ / ci t i m un bl oc di n f i s i erul sursasur sa. r ead( ( char *) buf f er, DI M_BUFFER) ;

    / / ver i f i camcat a f os t ci t i t ef ect i vi nt   nr Octeti Ci t i t i = sur sa. gcount ( ) ;

    / / scr i emi n f i s i erul des t i nat i edest i nat i e. wri t e( ( char * )buf f er , nrOctet i Ci t i t i ) ;

    }

    / / f i si er el e sunt i nchi se aut omat de cat r e dest r uctori} 

    Supraîncărcarea operatorilorSupraîncărcarea operatorilor se face la fel ca în cazul operatorilor de I/E pentruconsolă, cu menţiunea că se vor folosi clasele ifstream şi ofstream în locul claseloristream respectiv ostream.

    Exemplu de supraîncărcare pentru clasa Persoana (pentru fişiere binare):

    #i ncl ude  / / obi ectel e pent r u l ucrul cu consol a#i ncl ude  / / obi ectel e pent r u l ucrul cu f i si er eusi ng  namespace  std;

    / / numarul maxi m de car act ere pent r u un numeconst   i nt   DI M_MAX_NUME = 200;

    / / Cl asa Per soana: Cont i ne dat el e r ef er i t oar e l a o per soana.cl ass  Per soana{publ i c:

    / / constr uctorPersoana( i nt   cod = 0, char * nume = "Anoni m"){

    / / copi em dat el e pr i mi t e ca par amet r i _cod = cod;st r cpy( _nume, nume) ;

    }

    / / f uncti i de accesi nt   Get Cod( ) const   { return  _cod; }const   char * Get Nume( ) const   { return  _nume; }

    pr i vat e:/ / date membre

    i nt   _cod;char   _nume[ DI M_MAX_NUME] ;};

    / / Oper at or i de I / E pent r u f i si er e bi nar e

    / / Sal vam datel e i n f i si er i n f ormatul : Cod| Nr Caract ereNume| Numeof st r eam& operator  

  • 8/15/2019 Fisiere - POO

    8/9

      / / scr i em numar ul de car actere i n f i si erout . wri t e( ( char *) &di mNume, si zeof ( di mNume) ) ;

    / / scr i em numel e i n f i s i erout . wr i t e( per soana. Get Nume( ) , di mNume) ;

    return  out ;

    }

    / / Sal vam datel e di n f i si er i n f ormatul : Cod| Nr Caract ereNume| Numei f st r eam& operator   >> ( i f st r eam& i n, Per soana& per soana){

    / / ci t i m codul , numar ul de car actere di n f i si eri nt   cod, di mNume;i n. r ead( ( char *) &cod, si zeof ( i nt ) ) ;i n. r ead( ( char *) &di mNume, si zeof ( di mNume) ) ;

    / / al ocam spat i u pent ru nume si i l c i t i m di n f i s i erchar   *nume = new  char [ di mNume + 1] ;i n. r ead( nume, di mNume) ;

    / / adaugam t er mi nat or ul de si rnume[ di mNume] = ' \ 0' ;

    / / punem dat el e i n obi ectper soana = Persoana( cod, nume) ;

    / / deal ocam spat i ul t emporar pent r u numedel et e  [ ] nume;

    return  i n;}

    / / Oper at or i de I / E pent r u consol a

    / / Operat or pent r u af i sarea pe moni t or

    ost r eam& operator  

  • 8/15/2019 Fisiere - POO

    9/9

      / / cream un obi ect Per soana si ci t i m dat el e de l a t ast at ur aPer soana pers;ci n >> per s;

    / / sal vam obi ectul i nt r- un f i s i er bi nar f ol osi nd operatorulof str eam f i sOut( "persoana. bi n", i os: : out | i os: : t runc | i os: : bi nary);f i sOut > pers2;

    / / af i samdatel e ci t i te di n f i s i ercout