[romanian book]c++ -cap 13

Upload: againstallnoobs

Post on 30-May-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    1/18

    CAPITOLUL 13Intrri/ieiri

    INTRRI/IEIRI

    13.1. Principiile de baz ale sistemului de 13.4. Metodele clasei istreamI/O din limbajul C++ 13.5. Metodele clasei ostream

    13.2. Testarea i modificarea strii unui flux 13.6. Manipulatori creai de utilizator13.3. Formatarea unui flux 13.7. Fluxuri pentru fiiere

    13.3.1. Formatarea prin manipulatori 13.8. Fiiere binare13.3.2. Formatarea prin metode

    13.1. PRINCIPIILE DE BAZ ALE SISTEMULUI DE INTRRI/IERIDIN LIMBAJUL C++

    n limbajul C++ exist dou sisteme de intrri/ieiri:Unul tradiional, motenit din limbajul C, n care operaiile de intrare/ieire se realizeaz cu ajutorul unor funcii din biblioteca standard a sistemului (vezi capitolul 8);Unul propriu limbajului C++, orientat pe obiecte.

    Sistemul de I/O orientat pe obiecte al limbajului C++ trateaz n aceeai manier operaiile de I/O carefolosesc consola i operaiile care utilizeaz fiiere (perspective diferite asupra aceluiai mecanism).

    La baza sistemului de I/E din C++ se afl:dou ierarhii de clase care permit realizarea operaiilor de I/O;conceptul de stream (stream-ul este un concept abstract care nglobeaz orice flux de date de la o surs(canal de intrare) la o destinaie (canal de ieiere), la un consumator. Sursa poate fi tastatura (intrareastandard), un fiier de pe disc sau o zon de memorie. Destinaia poate fi ecranul (ieirea standard), unfiier de pe disc sau o zon de memorie (figura 13.1).

    Avantajele utilizrii stream-urilor sunt:Flexibilitate mare n realizarea operaiilor de I/O (mai mare dect n cazul folosirii funciilor din C);Posibilitatea de eliminare a erorilor care apar n mod frecvent la apelul funciilor de I/O obinuite, cnd

    numrul specificatorilor de format difer de cel al parametrilor efectivi;

    205

    Figura 13.1. Stream-ul - baza sistemului de I/O

    Fluxuri dinclasaostream

    Fluxuri dinclasaistream

    Memoria intern

    fiiere

    Fluxuri dinclasa

    ofstream

    Fluxuri dinclasa

    ifstream

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    2/18

    CAPITOLUL 13Intrri/ieiri

    Posibilitatea de a realiza operaii de I/O nu numai cu date de tipuri predefinite, ci i cu obiecte de tipabstract.

    Biblioteca de clase de I/O a limbajului C++ utilizeaz motenirea, polimorfismul i clasele abstracte. Ierarhiaare dou clase de baz (figura 13.2.):

    Clasa virtualios care ofer informaii despre fluxurile de date (variabile de stare, metode) i facilititratarea erorilor;Clasastreambuf (clas prieten cuios ), destinat operaiilor de I/O cu format.

    Utilizarea ierarhiilor de clase de mai sus implic includerea headeruluiiostream.h .Clasaios are un pointer ctre streambuf. Are date membru pentru a gestiona interfaa cu streambuf i

    pentru tratarea erorilor. Clasele derivate din clasa de bazios :Clasaistream , care gestioneaz intrrile: class istream:virtual public iosClasaostream gestioneaz ieirile: class ostream: virtual public ios

    Clasaiostream , derivat din istream i ostream, gestioneaz intrrile i ieirile. Fiecrui fluxde date i se asociaz n memorie o zon tampon numit buffer . Clasa furnizeaz funcii generale pentru lucrul cu zonele tampon i permite tratarea operaiilor de I/O fr a avea n vedereformatri complexe.class iostream:public istream, public ostream

    Clasele istream, ostream i iostream sunt, fiecare, clase de baz pentru clasele derivate:class istream_withassign:public istream class ostream_withassign:public ostream class iostream_withassign:public iostream

    Clasele cu sufixul_withassign furnizeaz urmtoarele fluxurile predefinite (instane), deja cunoscute:1. cout (console output) obiect al claseiostream_withassign , similar fiierului standard de ieire

    definit de pointerulstdout (n C). Se folosete cu operatorul insertor, suprancrcat pentru tipurile predefinite: Exemplu: int n; coutn;

    206

    ios

    istream ostream

    iostream

    strstreambase

    streambuf

    filebuffstream

    fstreambase

    ifstream ofstream

    Figura 13.2. Ierarhia claselor de intrare/ieire

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    3/18

    CAPITOLUL 13Intrri/ieiri

    Extrage din fluxul de intrare caracterele corespunztoare, le convertete din zecimal n binar i ledepune n memorie.

    3. cerr : flux de ieire conectat la ieirea standard pentru erori ( stderr n C) (fr buffer intermediar).4. clog : flux de ieire conectat la ieirea standard pentru erori (fr buffer intermediar).

    Clasa streambuf este clas prieten cuios . Ea furnizeaz funcii generale pentru lucrul cuzonele tampon (buffere) i permite tratarea operaiilor de I/O fr formatri complexe. Din clasastreambuf deriva clasafilebuf .

    S urmrim care este rolul buffere-lor (zon tampon asociat fiecrui flux de date), prin urmtorul exemplu:

    Exemplu:void main(){int a; double x; char sir[20];cin>>a>>x>>ir;couta>>x; // fluxul de date se transmite i lui xPresupunem c am introdus de la tastatur325 17.45e5 exemplu de ir , valorile pentrua , x isir . La apsarea tastei Enter, se transmite ctre sistemul de operare un octet cu semnificaia de sfritintroducere date. Sistemul de operare transmite un semnal zonei tampon i abia acum se transmite valoarea(fluxul de date) lui a. La citirea irului de caractere (pn la primul blank), se transfer octet cu octet (i seadaug automat caracterulNULL), din zona tampon n memoria intern.

    Observaii:1. Stream-ul este secvenial.2. El poate realiza intrri/ieiri formatate.

    3. Este bine c n cazul unui flux de intrare s se verifice mai nti dac n zona tampon se gsete ceva.Dac nu, se poziioneaz cursorul la nceputul zonei tampon.4. Informaia de la buffer ctre memorie este gestionat prin program; informaia de la zona tampon ctre

    alte periferice este gestionat de ctre sistemul de operare.

    13.2. TESTAREA I MODIFICAREA STRII UNUI FLUX

    Clasa ios , clas de baz a ierahiei claselor de I/O,definete o mulime de tipuri, variabile i metodecomune tuturor tipurilor de stream-uri .

    Starea unui stream (rezultatul ultimului acces la acesta) este pstrat ncuvntul de stare, care estedatmembra claseiios . Fiecrei instanieri a unei clase de intrare/ieire i se asociaz propriul cuvnt de stare

    207

    date deintrare

    Memorie intern

    a

    x

    sir

    buffer cin

    buffer cout

    Figura 13.3. Rolul buffere-lor n operaiile de I/O

    Zona tampon (buffer-ul) este interfaadintre program i sistemul de operare.

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    4/18

    CAPITOLUL 13Intrri/ieiri(o mulime de indicatori de stare), care pstreaz toate informaiile aferente erorilor aprute n cursuloperaiilor cu stream-ul. Aceti indicatori sunt memorai la nivel de bit n data membrustate.

    class ios {//protected:

    int state; //pstreaz la nivel de bit valorile indicatorilor de starepublic:enum io_state{

    goodbit=0x00, //ultima operaie de intrare/ieire corecteofbit=0x01, //s-a ntlnit sfritul de fiier ntr-o operaie de intrare (lipsa

    //caracterelor disponibile pentru citire)failbit=0x02, //setat dac ultima operaie de intrare/ieire a euat; stream-ul

    //respectiv nu va mai putea fi folosit n operaii de I/O pn cnd//bitul nu va fi ters

    badbit=0x04, //ultima operaie de intrare/ieire invalid; n urma resetrii flag-ului//este posibil ca stream-ul s mai poat fi utilizat

    hardbit=0x08 //eroare irecuperabil};

    };

    Testarea valorii cuvntului de stareasociat unui stream se realizeaz cu ajutorulmetodelor:int good(); //Returneaz valoare diferit de zero dac cuvntul de stare este 0int eof(); //Returneaz valoare diferit de zero daceofbit este setatint fail(); //Returneaz valoare diferit de zero dacfailbit , hardbit saubadbit sunt setaiint bad(); //Funcioneaz ca metoda fail, dar nu ia n considerare flagulfailbit .

    Modificarea valorii cuvntului de stareasociat unui stream se realizeaz cu ajutorulmetodelor: void clear(int i=0);

    Seteaz data membrustate la valoarea parametrului (implicit 0). Este capabil s tearg orice flag, cuexcepia flag-uluihardfail . Exemplu: : a.clear(ios::badbit);Seteaz bitulfailbit i anuleaz valorile celorlai bii din cuvntul de stare a fluxuluia . Pentru caceilali bii s rmn nemodificai, se apeleaz metodardstate .

    Exemplu: a.clear(a.rdstate()|val_f);Se seteaz un singur flag, lsndu-le nemodificate pe celelalte;val_f are una din valorile definite deenumerareaio_state .int rdstate();Returneaz valoarea cuvntului de stare, sub forma unui ntreg (valoarea datei membrustate ).

    Exemplu: a.clear(ios::badbit | a.rdstate());Seteaz bitul

    failbit, fr a modifica valorile celorlali bii:

    Testarea cuvntului de starese poate realiza i prin folosireaoperatorilor! i void* :Operatorul! este suprancrcat printr-o funcie membr, cu prorotipul:

    int operator ! ();care returneaz 0 dac un bit de eroare din cuvntul de stare este setat (ca i metodafail ).

    Exemplu: if (!cin) //echivalent cu if (!cin.good())

    couta;

    Operatorul void* convertete stream-ul ntr-un pointer generic. Conversia are ca rezultat zero dac cel puin un bit de eroare este setat:

    operator void *();

    208

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    5/18

    CAPITOLUL 13Intrri/ieiri

    Exemplu: O construcie de forma: cin>>s; are ca valoare o referin la stream-ulcin , dinclasa istream. Aceast referin poate fi utilizat sub forma:if (cin>>s). . .

    Pentru scoaterea unui stream din starea de eroare, fie dispare cauza erorii, fie trebuie terse flagurilecare semnalizeaz eroarea.

    13.3. FORMATAREA DATELOR DIN FLUXURILE DE INTRARE/IEIRE

    Unul dintre principalele avantaje oferite de sistemul de I/O din limbajul C++ l reprezint ignorareaaspectului formatrii, folosindu-se o formatare implicit . n plus, se permite definirea unei formatrispecifice pentru o anumit aplicaie. Aa cum s-a subliniat n cazul cuvntului de eroare, cuvntul de format poate fi privit ca un ntreg, pentru care fiecare bit reprezint o constant predefinit din clasa ios. n cadrulacestui cuvnt sunt definite cmpuri de bii (cuvntul de formatestedat membrcare conine un numr de indici ce sunt bii individuali).

    class ios {//protected:

    long flag_x; //pstreaz la nivel de bit indicatorii de formatint x_width; //numrul de caractere utilizate pentru afiarea unei valori pe ecran

    public:enum {skipws = 0x0001, // salt peste spaiile albe de la intrareleft = 0x0002, // aliniere la stnga la ieireright = 0x0004, // aliniere la dreapta la iesireinternal = 0x0008, // aliniere dup semn sau specificator al bazei la ieiredec = 0x0010, // conversie n baza 10oct = 0x0020, // conversie octal la intrare/ieirehex = 0x0040, // conversie hexa la intrare/ieireshowbase = 0x0080, // afiarea bazei la ieireshowpoint = 0x0100, // afiarea punctului zecimal pentru numere reale la ieireuppercase = 0x0200, // afiarea cu majuscule a cifrelor hexa i a literei E la ieire.showpos = 0x0400, // afiarea semnului + pentru numerele pozitive la ieirescientific = 0x0800, //folosirea formatului exponenial (tiinific) pentru numerele realefixed = 0x1000, // folosirea formatului n virgul fix pentru numere reale launitbuf = 0x2000, // golete zona tampon dup fiecare ieirestdio=0x4000 // golete "stdout" i "stdin" dup fiecare inserare};};n figura 13.4. sunt prezentate numele cmpurilor de bii (acolo unde este cazul). n cadrul fiecrui cmp de bii (adjustfield , basefield , floatfield ) un singur bit poate fi activ.

    209

    adjustfield

    u n

    i t b u

    f

    f i x e

    d

    s c

    i e n t i f i c

    s h o w p o s

    u p p e r c a s e

    s h o w p o

    i n t

    s h o w

    b a s e

    h e x

    o c t

    d e c

    i

    n t e r n a

    l

    r i g

    h t

    l

    e f t

    s k i p w s

    floatfield floatfield basefield

    Figura 13.4. Cmpurile de bii din cuvntul de stare

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    6/18

    CAPITOLUL 13Intrri/ieiri

    Modificarea cuvntului de formatse poate realiza n urmtoarele moduri:1. Cu ajutorulmanipulatorilor (cu sau fr parametri);2. Cu ajutorul unor funcii membre ale claselor istream sauostream .

    13.3.1. FORMATAREA PRIN MANIPULATORI

    Manipulatorii sunt funcii speciale , asemntoare operatorilor, care pot fi folosite mpreun cu operatorii deinserie ntr-un flux de ieire sau de extracie dintr-un flux de intrare, n scopul modificrii caracteristicilor formatului informaiilor de intrare/ieire. Manipulatorii furnizeaz, ca rezultat, fluxul obinut n urma aciuniimanipulatorilor, ceea ce permite ca acetia s fie tratai ca informaii de transmis. Manipulatorii permit,deasemenea, nlnuirea operatorilor insertori sau extractori care utilizeaz formate diferite.

    Manipulatorii pot fi:Manipulatori fr parametri;Manipulatori cu parametri;

    13.3.1.1. Manipulatori fr parametri

    Prototipul manipulatorilor fr parametri este:ostream & nume_manipulator(ostream &);istream & nume_manipulator(istream &);

    Manipulatorii fr parametri (prezentai n tabelul 13.1.) se folosesc astfel:flux_ieiremanipulator;Tabelul 13.1Manipula

    torIntrare/Ieire

    Aciune

    dec I/O Formateaz datele numerice n zecimal (activeaz bitul de conversie zecimal)hex I/O Formateaz datele numerice n hexa (activeaz bitul de conversie hexazecimal)oct I/O Formateaz datele numerice n octal (activeaz bitul de conversie octal)ws I Ignor caracterele "spaii albe" (activeaz bitul de salt peste spaiile albe)

    endl O Afieaz (insereaz) un caracter '\n' i elibereaz fluxulends O Insereaz un caracter null, de sfrit de flux (\0)

    flush O Videaz (golete) buffer-ul, elibereaz fluxul

    13.3.1.2. Manipulatori cu parametri

    Prototipul manipulatorilor fr parametri (prezentai n tabelul 13.2.) este:istream & manipulator (argument);ostream & manipulator (argument);

    Tabelul 13.2.Manipulator Intrare/

    IeireAciune

    setbase(int baza) I/O Stabilete baza de conversieresetiosflags(long f) I/O Atribuie valoarea 0 tuturor biilor indicai de argument,

    210

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    7/18

    CAPITOLUL 13Intrri/ieiri

    lsnd restul biilor nemodificai (dezactiveaz indicatoriispecificai de f)

    setiosflags (long f) I/O Atribuie valoarea 1 tuturor biilor indicai de argument,lsnd restul biilor nemodificai (activeaz indicatoriispecificai de f)

    setfill (int c) I/O Definete caracterul de umplere (cel implicit este spaiulliber, blank-ul)

    setprecision (int p) I/O Definete precizia pentru numerele realesetw (int w) I/O Definete limea cmpului (numrul de octei care vor fi

    citii sau afisai)Utilizarea manipulatorilor impune includerea header-uluiiomanip.h .

    Exerciiu: Exemplificarea modului de folosire a manipulatorilor pentru intrri/ieiri formatate.

    #include #include void main(){int a,b,c;double alfa,x,y;long ll;char xx,yy;float u,v; unsigned int w; unsigned char ab,db;a=125,b=10; ll=100*a*b; cout

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    8/18

    CAPITOLUL 13Intrri/ieiri

    cout. setf (ios:: showpos | ios :: uppercase | ios:: internal) //toi biii vor fi setai pe valoarea 1

    cout.setf (ios :: hex, ios :: basefield) //seteaz indicelehex din cmpulbasefieldcout. setf (ios :: skipws | ios :: hex | ios:: showbase, ios :: basefield)

    Funcia membrfill permite testarea sau modificarea caracterului de umplere i returneaz codulcaracterului curent de umplere:

    int fill ( ) ; Exemplu: cout.fill ( ); // ntoarce codul caracterului de umplere pt. cout

    int fill (char) ;Seteaz noul caracter de umplere i returneaz codul vechiului caracter de umplere.

    Exemplu: cout.fill(# ); // seteaz un alt caracter de umplere ('#').Funcia membr precision permite testarea sau modificarea preciziei. Numim precizie numrul decifre semnificative (n GNU) sau numrul de cifre dup virgul (n TurboC)

    int precision ( );Returneaz valoarea actual a preciziei numerice.

    int precision (int);Seteaz precizia la valoarea parametrului i returneaz vechea valoare a preciziei.

    Funcia membrwidth returneaz valoarea actual a lungimii cmpului de date sau seteaz valoarealungimii cmpului de date.

    int width ( ) ;.int width (int) ;

    Exemplu: cout. width (10); //data se va afia ntr-un cmp de cel puin 10 caractere.Astfel, dac argumentul este 0, la inseria ntr-un flux de ieire se transmit n stream atia octei ci aredata respectiv. Dac argumentul este diferit de 0, dar lungimea necesar afirii este mai mare, setransmite numrul de octei necesari; iar dac lungimea necesar afirii este mai mic, se transmitenumrul de octei necesari, iar restul se completeaz cu caracterul de umplere.

    Exerci i u:#include

    void main(){int i=123, j=456; double x=1234.567890123456, y=5678;cout.width(5) ; cout

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    9/18

    CAPITOLUL 13Intrri/ieiri

    Operatorul de extracie din stream-ul (fluxul) de intrare este suprancrcat printr-o funcie membr , pentru toate tipurile de baz. El are rolul de a extrage din fluxul de intrare caracterele necesare pentru aobine o valoare dintr-un tip de baz.

    istream & operator >> (&tip_de_baz);Primul argument este implicit (this ): clasa care l apeleaz. Al doilea argument este o referin ctre untip_ de_baz . Operatorul poate fi suprancrcat printr-o funcie prieten (vezi capitolul 11), pentru aextrage din fluxul de intrare informaiile despre un obiect dintr-un tip definit de utilizator (clas):

    friend istream & operator >>(istream &, clasa &);Metoda get

    istream & get (char &);Metoda extrage din fluxul de intrare un caracter i l memoreaz n variabila referin, transmis ca parametru. ntoarce o referin ctre istream. Exemplu: char c; cin.get(c);Metodaget este suprancrcat i astfel:

    int get ( );Extrage din fluxul de intrare un singur caracter i l returneaz sub forma unui ntreg. Aceast metodeste utilizat, n special, la testarea sfritului de fiier (EOF, -1).

    Metodageteste suprancrcat i astfel:istream & get (char * ir, int lungime, char delimitator = \n)Se extrage din fluxul de date de intrare un ir de caractere (char * ir = pointer ctre ir), culungimea maxim specificat prin argumentullungime , pn la ntlnirea delimitatorului(delimitator nu se extrage din fluxul de date de intrare). Rezultatul se depune n variabila ir .

    Metoda getlineMetoda determin preluarea din fluxul de intrare a unui ir de caractere, terminat cu un caracter cunoscut.

    istream & getline (char * ir, int lungime, char delimitator = EOF);Acioneaz asemntor cu metodaget suprancrcat prin ultima form, cu deosebirea c din fluxul deintrare se extrage i delimitatorul. Delimitatorul nu se introduce n ir .

    Exemplu: char ir[50];cin.get (ir, 50, \ n); // sau cin.get(ir, 50) ;Din fluxul de date de intrare se extrag caracterele pn la sfrit de linie, cel mult 50 de caractere.Extragerea caracterelor din fluxul de intrare se termin fie la ntlnirea terminatorului, fie atunci cnds-a citit un numr de caractere egal culungime-1 .

    Metoda gcount returneaz un ntreg care reprezinat numrul efectiv de caractere preluat pringetline .

    int gcount();Metoda read extrage din fluxul de intrare un ir de caractere (octei) delungime impus i-ldepoziteaz n zona de memorieir .

    istream & read (char * ir, int lungime); Eemplu: char t[30]; cin.read(t, 20);Metodaignore este utilizat la golirea zonei tampon a stream-ului de intrare.

    istream & ignore (int lungime, char delimitator = | );Se extrag din fluxul de intrare caracterele pn ladelimitator, dar nu mai multe dect numrul indicat de parametrulungime. Caracterele extrase sunteliminate , nu sunt memorate.Metoda peck furnizeaz primul caracter din fluxul de intrare, fr a-l extrage ns din flux. Caracterulva fi primul caracter extras la urmtoarea citire.

    int peck( ); Exemplu: c = cin.peck ( );Metoda putback insereaz n fluxul de intrare caracterul trimis ca argument.

    istream & putback(char &);Observaii:1) int a; cin.get (a) cin >> a;2) Metodele pot fi folosite n serie: Exemplu: cin.get(a).get(b).get (c);

    213

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    10/18

    CAPITOLUL 13Intrri/ieiri

    13.5. METODELE CLASEI ostream

    Supradefinirea operatorului de inserie

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    11/18

    CAPITOLUL 13Intrri/ieiri

    istream &nume_manipulator (istream &); // pentru un flux de intrareCrearea manipulatorilor cu parametriCrearea manipulatorilor fr parametri necesit folosirea a dou funcii:ostream & nume_manipulator (ostream &, int);

    omanip nume_manipulator (int n) // funcie ablon (template) cu parametru de tip int{return omanip (nume_manipulator, n);}

    Deci, manipulatorii sunt funcii ale cror corpuri sunt stabilite de utilizator.

    Exemplu: n exemplul urmtor se definesc manipulatoriiindentare (indentare = naintea liniei propriu-zise, se las un numr de spaii albe),convhex (realizeaz conversia din zecimal n hexa),init(iniializeaz lungimea cmpului la 10 caractere, stbilete precizia la 4 i caracterul de umplere $).

    #include #include ostream & convhex (ostream &ies)

    {ies.setf(ios::hex, ios::basefield); ies.setf(ios::showbase); return ies;}ostream & indentare (ostream &ies, int nr_spaii){for (int i=0; i

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    12/18

    CAPITOLUL 13Intrri/ieiriFluxul nu este asociat nici unui fiier

    ifstream(const char *nume_fisier, int mod_acces=ios:in);Parametri constructorului sunt numele fiierului i modul de acces la acesta (citire, fiier de intrare).

    ifstream (int fd, char *buffer, int lung_buffer);Parametrii sunt numrul intern al fiierului (fd ), zona tampon de intrri/ieiri (buffer ) i lungimea zoneitampon (lung_buffer ).

    Exemplu: Se declar obiectul numitfis_ies , de tipulofstream , obiect asociat unui fiier cu numeleDATE.txt ,deschis apoi pentru ieire (scriere). Scrierea n fiierul asociat obiectului se face printr-un flux care beneficiaz de toate "facilitile" claseiostream .

    ofstream fis_ies("DATE.txt", ios::out); //sau:ofstream fis_ies("DATE.txt");Scrierea n fiierulDATE.txt : fis_ies . . . >> . . .;Pentru citire formatat sau citire binar din fiierul asociat:fis_intr.read(. . . );Pentru examinarea strii fluxului de eroare corespunztor: if (fis_intr) . . .;

    Observaii: Conectarea (asocierea) unui flux unui fiier presupune:Fie existena a dou tipuri de obiecte: un flux i un fiier;Fie declararea unui flux care va fi asociat ulterior unui fiier.

    Clasa fstream motenete att clasele ifstream, ct i ofstream. Ea permite accesul n citire/scriere.Constructorul cu parametri al clasei fstream:fstream(char *nume_fiier,int mod_deschid,int protec=filebuf::openprot);

    Modul de deschidere (mod_deschid ) a unui fiier poate fi:ios::in fiier de intrareios::out fiier de ieireios::ate dup deschiderea fiierului, poziia curent este sfritul acestuiaios::app mod append (de scriere la sfritul unui fiier existent)ios::trunc dac fiierul exist, datele existente se pierdios::nocreate dac fiierul asociat nu exist, nu va fi creat dect la scriereios::binary fiier binar ios::noreplace fiierul nu trebuie s existe

    Modul de deschidere este definit printr-un cuvnt de stare, n care fiecare bit are o semnificaie particular.Pentru setarea (activarea) mai multor bii, se folosete operatorul | (sau logic, pe bit), ca n exemplu.class ios{//..

    public:enum open_mode{

    in=0x01, out=0x02, ate=0x04,app=0x08, trunc=0x10, nocreate=0x20,noreplace=0x40, binary=0x80

    };};

    216

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    13/18

    CAPITOLUL 13Intrri/ieiri

    Exemple: ifstream f1("DATE.txt", ios::in|ios::nocreate);fstream f2("pers.dat", ios::in|ios::out);

    Metoda open Prelucrarea unui fiier ncepe cu deschiderea acestuia, care se poate realiza:

    La instanierea obiectelor din clasele ifstream, ofstream sau fstream, cu ajutorul constructorului cu parametri (constructorul apeleaz automat funcia open);Prin apelul explicit al funciei open.Metoda open este definit n clasafstreambase i este suprancrcat n funciile derivate din

    aceasta. Ea are aceeai parametri ca i constructorul clasei i prototipul: void open (char *nume_fiier, int mod_deschidere, int protecie);

    Metodaclose realizeaz nchiderea unui fiier: void close();

    Exerciiu: n exemplul urmtor se asociaz fluxului de ieire (obiectuluifis_ies ) fiierul numittext.txt . Se testeaz cuvntul de stare de eroare, iar dac nu au fost probleme la deschidere, n fiier se

    scrie un text (2 linii), apoi, o serie de constante numerice, formatate. Se nchide fiierul. Acelai fiier esteasociat unui flux de intrare (pentru citire). Textul (scris anterior) este citit n variabila ir , apoi este afiat.Se citesc din fiier i apoi sunt afiate constantele numerice. Se nchide fiierul.

    #include #include int main(){ofstream fis_ies("text.txt"); //deschidere fiier text.txtif (!fis_ies){ cout

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    14/18

    CAPITOLUL 13Intrri/ieiri

    {char nume_sursa1[14], nume_sursa2[14], destinatie[14];ifstream f1, f2; ofstream dest;cout

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    15/18

    CAPITOLUL 13Intrri/ieirinu exist un terminator de linie, trebuie specificat lungimea nregistrrii. Metodelewrite , read nurealizeaz nici o conversie.

    Metodawrite scrie n fiier un numr de n octei:ostream &write(const char * tab, int n);

    Metodaread citete din fiier n octei.istream &read (const char * tab, int n);

    Limbajul C++ ofer (ca i limbajul C) posibilitatea de acces direct ntr-un fiier conectat la un flux de date.Dup fiecare operaie de citire (extragere din fluxul de intrare) sau citire (inserie n fluxul de ieire), pointerul care indic poziia curent n fluxul de date este incrementat cu un numr egal cu numrul de octeitransferai. n aceast situaie se realizeaz un acces secvenial (ca n cazurile precedente).

    Clasele ifstream i ofstream au ca metode funciileseekg (membr a claseiistream ), respectivseekp (membr a claseiostream ) care permit modificarea valorii pointerului.

    istream & seekg(long);istream & seekg(long, seek_dir);

    ostream & seekp(long);ostream & seekp(long, seek_dir);

    Ambele metode primesc doi parametri:un ntreg reprezentnd deplasarea pointerului n raport cu baza (referina) precizat de al doilea parametru;o constant ntreag care precizeaz baza. Valorile constantei sunt definite n clasaios :

    class ios{ //. . .public:

    enum seek_dir{ beg=0, deplasare fa de nceputul fiierului (implicit)

    cur=1, deplasare fa de poziia curentend=2 deplasare fa de sfritul fiierului};

    };

    Pentru aflarea valorii pointerului, clasaifstream are metodatellg , iar clasaofstream are metodatellp , cu prototipurile:

    long istream::tellg();long ostream::tellp();

    Exemplu: Se creaz ierarhia de clase din figura 13.5., n care se implemen-

    teaz clasastudent i clasa propriefisier_stud, clasderivat dinfstream . n acelai fiier, binar,se realizeaz i scrierea i citirea.Datorit posibilitii de acces direct,se pot modifica informaiile referitoarela studentul nregistrat n fiier pe poziia k.

    #include #include class student{ char nume[20];

    int grupa, note[3];

    public: void citire_date();friend ostream &operator

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    16/18

    CAPITOLUL 13Intrri/ieiri

    friend class fisier_stud;};

    class fisier_stud:public fstream //fiier binar cu obiecte din cls student{public:fisier_stud(){;};

    fisier_stud(const char*num_f,int mod,intprotecie=filebuf::openprot):fstream(num_f,mod |ios::binary,protecie){}void open(const char *num_f, int mod, int protectie=filebuf::openprot)

    {fstream::open(num_f,mod|ios::binary,protectie);} //apelul met. open din cls. fstreamint citeste_f(student &);int scrie_f (const student &);};

    void student::citire_date(){ int gr, OK;for (int k=0; k

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    17/18

    CAPITOLUL 13Intrri/ieiri

    cout

  • 8/14/2019 [Romanian Book]C++ -Cap 13

    18/18

    CAPITOLUL 13Intrri/ieiriChestiuni practice

    Rezolvai problemele din capitolul 8, folosind abordarea orientat pe obiecte.

    222