This shows you the differences between two versions of the page.
poo-is:laboratoare:10 [2020/10/08 17:25] ruben_gilian.udroiu [3. Stream] |
poo-is:laboratoare:10 [2020/10/12 15:14] (current) ruben_gilian.udroiu [3. Stream] |
||
---|---|---|---|
Line 212: | Line 212: | ||
Operatorii **<<** si **>**> sunt definiti dupa cum urmeaza: | Operatorii **<<** si **>**> sunt definiti dupa cum urmeaza: | ||
- | + | ||
ostream &operator<< (ostream &, consttip_de_baza &); | ostream &operator<< (ostream &, consttip_de_baza &); | ||
| | ||
Line 218: | Line 218: | ||
Acestia pot fi supradefiniti pentru tipuri de date definite de utilizator: | Acestia pot fi supradefiniti pentru tipuri de date definite de utilizator: | ||
- | + | ||
- | friend ostream& operator<< (ostream&, constTIP &); | + | friend ostream& operator<< (ostream&, constTIP &); |
- | friend istream& operator>> (istream&, TIP &); | + | friend istream& operator>> (istream&, TIP &); |
- | + | ||
Pe langa operatorii << si >>, clasele istream si ostream au implementate functiile elementare **get** si **put** | Pe langa operatorii << si >>, clasele istream si ostream au implementate functiile elementare **get** si **put** | ||
- | + | ||
ostream& put (char c); | ostream& put (char c); | ||
istream& get (char& c); | istream& get (char& c); | ||
== Exemplu == | == Exemplu == | ||
- | + | ||
char ch; | char ch; | ||
cin.get(ch); | cin.get(ch); | ||
Line 234: | Line 234: | ||
==Functii de citire/modificare a starii:== | ==Functii de citire/modificare a starii:== | ||
- | + | ||
- | bool bad(); -> arata daca a existat o eroare la efectuarea ultimei operatii | + | | obool bad(); | arata daca a existat o eroare la efectuarea ultimei operatii | |
- | bool good(); -> arata daca ultima operatie s-a efectuat cu succes | + | | bool good(); | arata daca ultima operatie s-a efectuat cu succes | |
- | void clear(); -> sterge indicatorii de eroare | + | | void clear(); | sterge indicatorii de eroare | |
== Manipulatori == | == Manipulatori == | ||
- | Manipulatorii reprezinta operatii ce pot fi inserate in secventele de citire/scriere. Acestia fac ca urmatoarele operatii de citire sau scriere sa aiba loc cu un alt tip de conversie. | + | <note>Manipulatorii reprezinta operatii ce pot fi inserate in secventele de citire/scriere. Acestia fac ca urmatoarele operatii de citire sau scriere sa aiba loc cu un alt tip de conversie. |
+ | </note> | ||
+ | |||
+ | Sintaxa: | ||
+ | cout << manipulator << ....; | ||
- | Sintaxa: | + | Exemplu: |
+ | cout << hex << 10 << endl << 11;//OUTPUT: a b | ||
+ | cin >> oct >> i; // i va fi citit de la consola in baza 8 | ||
- | cout << manipulator << ....; | + | Manipulatorii fara parametri sunt: |
- | Exemplu : | + | -dec (specifica baza10) |
- | cout << hex << 10 << endl << 11;//OUTPUT: a b | + | -oct (specifica baza8) |
+ | -hex (specifica baza16) | ||
+ | -endl (end of line, adica insereaza'\n') | ||
+ | -ws (ignora spatiile goale: space, tab ) | ||
+ | -ends (end of string, adica insereaza '\0') | ||
+ | -flush (goleste bufferul de iesire) | ||
+ | |||
+ | Exemplu: | ||
+ | int x; | ||
+ | cin >> hex >> x; //F | ||
+ | cout << dec << x;//15 | ||
+ | |||
+ | string s, s1; | ||
+ | cin >> ws >> s; // introducde la tastatura textul: ”xx yy zz” | ||
+ | cout << s; //xx | ||
+ | cin >> s1; //fara sa scriu ceva de la tastatura, in s1 se citeste in continuare yy | ||
+ | cout << s1; //yy | ||
+ | cout << flush; | ||
- | cin >> oct >> i; // i va fi citit de la consola in baza 8 | + | Manipulatori cu parametri (definiti in **iomanip.h**): |
- | + | ||
- | Manipulatorii fara parametri sunt : | + | setprecision (int n) - (pentru numerele reale) precizia este setata la n zecimale |
- | + | setw (int n) - seteaza latimea campului pentru afisare la n | |
- | -dec(specifica baza10) | + | setfill (char ch) - selecteaza caracterul de umplere (completeaza pozitiile libere din camp) |
- | -oct(specifica baza8) | + | |
- | -hex(specifica baza16) | + | |
- | -endl(end of line, adica insereaza'\n') | + | |
- | -ws(ignora spatiile goale: space, tab ) | + | |
- | -ends(end of string, adica insereaza '\0') | + | |
- | -flush(goleste bufferul de iesire) | + | |
- | + | ||
- | exemplu: intx; | + | |
- | cin>>hex>>x;//F | + | |
- | cout<<dec<<x;//15 | + | |
- | + | ||
- | + | ||
- | string s,s1; | + | |
- | cin>>ws>>s; // introducde la tastatura textul: ”xx yy zz” | + | |
- | cout<<s; //xx | + | |
- | cin>>s1; //fara sa scriu ceva de la tastatura, in s1 se citeste in continuare yy | + | |
- | cout<<s1; //yy | + | |
- | cout<<flush; | + | |
- | + | ||
- | Manipulatori cu parametri (definiti in iomanip.h) | + | |
- | + | ||
- | setprecision(int n) - (pentru numerele reale) precizia este setata la n zecimale | + | |
- | setw(int n) - seteaza latimea campului pentru afisare la n | + | |
- | setfill(char ch) - selecteaza caracterul de umplere (completeaza pozitiile libere din camp) | + | |
=== 3.2. ifstream, ofstream si fstream === | === 3.2. ifstream, ofstream si fstream === | ||
Pentru deschiderea de fisiere putem folosi constructorii cu/fara parametri pusi la dispozitie pentru toate tipurile de fisiere (intrare, iesire si intrare-iesire) | Pentru deschiderea de fisiere putem folosi constructorii cu/fara parametri pusi la dispozitie pentru toate tipurile de fisiere (intrare, iesire si intrare-iesire) | ||
- | + | ||
- | ofstream::ofstream(const char*nume, int mod=ios::out, int acces=0) | + | ofstream::ofstream(const char*nume, int mod=ios::out, int acces=0) |
- | nume - numele fisierului | + | nume - numele fisierului |
- | mod - modul de acces | + | mod - modul de acces |
- | acces - tipul de protectie/acces | + | acces - tipul de protectie/acces |
- | + | ||
- | exemplu : ofstream ofis("date1.txt",ios::app); | + | Exemplu: |
- | + | ofstream ofis("date1.txt",ios::app); | |
Modurile (preferinite in clasa ios) sunt: | Modurile (preferinite in clasa ios) sunt: | ||
- | ios::in - intrare | + | *ios::in - intrare |
- | ios::out - iesire | + | *ios::out - iesire |
- | ios::ate - deschidere cu pozitionare la sfarsitul fisierului | + | *ios::ate - deschidere cu pozitionare la sfarsitul fisierului |
- | ios::app - append, adaugare la sfarsitul fisierului | + | *ios::app - append, adaugare la sfarsitul fisierului |
- | ios::binary - deschidere in mod binar | + | *ios::binary - deschidere in mod binar |
- | Nota: modurile pot fi combinate cu SAU logic la nivel de bit (|) | + | <note>Modurile pot fi combinate cu SAU logic la nivel de bit (|) |
- | + | ||
- | acces = 0 - normal | + | |
- | = 1 - read-only | + | |
- | = 2 - hidden | + | |
- | = 3 - sistem | + | |
+ | **Acces** | ||
+ | *0 - normal | ||
+ | *1 - read-only | ||
+ | *2 - hidden | ||
+ | *3 - sistem | ||
+ | </note> | ||
+ | |||
Se poate folosi si functia cu efect similar: | Se poate folosi si functia cu efect similar: | ||
- | void open (const char *nume_fisier, int mod, int acces) | + | void open (const char *nume_fisier, int mod, int acces) |
- | In urma deschiderii, este indicata testarea pentru erori : | + | In urma deschiderii, este indicata testarea pentru erori: |
- | if(!numefis) cout << "eroare"; | + | if (!numefis) cout << "eroare"; |
+ | |||
+ | Pentru inchiderea unui fisier, se foloseste functia "**void close();**", functie ce este apelata de destructorul claselor ce lucreaza cu fisiere, deci fisierul va fi inchis **automat** la finalul duratei de viata a variabilei de tip fisier. | ||
- | Pentru inchiderea unui fisier, se foloseste functia "void close();", functie ce este apelata de destructorul claselor ce lucreaza cu fisiere, deci fisierul va fi inchis *automat* la finalul duratei de viata a variabilei de tip fisier. | + | Putem citi o linie dintr-un fisier text (sau cin) cu functia: |
- | + | getline(unsigned char *buf, int l, char delim); | |
- | Putem citi o linie dintr-un fisier text (sau cin) cu functia : | + | |
- | + | Functia **getline** citeste in buf cel mult **l-1** caractere, pana la intalnirea caracterului **delim**, care este implicit **'\n'(newline)** si pune **'\0'** la sfarsitul liniei citite. | |
- | getline(unsigned char *buf, int l, char delim); | + | |
- | + | ||
- | Functia getline citeste in buf cel mult l-1 caractere, pana la intalnirea caracterului delim, care este implicit '\n'(newline) si pune '\0' la sfarsitul liniei citite. | + | |
Exemplu: | Exemplu: | ||
- | ifstream ifis("date2.dat"); | + | ifstream ifis("date2.dat"); |
- | char buf[256]; | + | char buf[256]; |
- | while(!ifis.eof()) { | + | while(!ifis.eof()) { |
ifis.getline(buf, 256, '\n'); | ifis.getline(buf, 256, '\n'); | ||
cout << buf << endl; | cout << buf << endl; | ||
- | } | + | } |
- | *A se consulta cursul pentru mai multe exemple | + | <note important>A se consulta cursul pentru mai multe exemple!</note> |
- | Fisiere binare | + | ==Fisiere binare== |
In cazul fisierelor binare, nu se pot folosi functiile obisnuite de citire/scriere deoarece datele nu sunt formatate in vreun fel anume. | In cazul fisierelor binare, nu se pot folosi functiile obisnuite de citire/scriere deoarece datele nu sunt formatate in vreun fel anume. | ||
- | Clasele specializate pentru fisiere binare includ doua functii pentru citirea si scrierea secventiala : write si read | + | Clasele specializate pentru fisiere binare includ doua functii pentru citirea si scrierea secventiala: |
+ | -**write** | ||
+ | -**read** | ||
+ | |||
+ | istream& read(unsigned char *buf, intn); | ||
+ | ostream& write(constunsigned char *buf, intn); | ||
- | istream& read(unsigned char *buf, intn); | + | Functiile citesc/scriu din/in fisierul respectiv **n octeti** in/din buf |
- | ostream& write(constunsigned char *buf, intn); | + | |
- | Functiile citesc/scriu din/in fisierul respectiv n octeti in/din buf | + | Pozitionarea absoluta in fisierul binar este realizata de metodele **seekg** (citire din **ifstream**) si **seekp** (scriere in **ofstream**): |
- | + | ||
- | Pozitionarea absoluta in fisierul binar este realizata de metodele seekg (citire din ifstream) si seekp(scriere in ofstream) : | + | ifstream& seekg(long poz, int reper); |
- | + | ofstream& seekp(long poz, int reper); | |
- | ifstream& seekg(long poz, int reper); | + | poz = pozitia in octeti |
- | ofstream& seekp(long poz, int reper); | + | Reper poate fi una dintre constantele: |
- | + | ios::beg (pozitionare fata de inceput) | |
- | poz = pozitia in octeti | + | ios::cur (fata de pozitia curenta) |
- | reper poate fi una dintre constantele : ios::beg (pozitionare fata de inceput), ios::cur (fata de pozitia curenta), ios::end(fata de sfarsit); | + | ios::end (fata de sfarsit) |