This shows you the differences between two versions of the page.
poo-is:laboratoare:10 [2020/10/04 19:55] ruben_gilian.udroiu [4. Manipulatori] |
poo-is:laboratoare:10 [2020/10/12 15:14] (current) ruben_gilian.udroiu [3. Stream] |
||
---|---|---|---|
Line 198: | Line 198: | ||
-**<fstream> (operatii fisiere)** | -**<fstream> (operatii fisiere)** | ||
</note> | </note> | ||
- | === 3.1. Iostream === | + | === 3.1. iostream === |
- | Denumirea de "iostream" provine de la standard input-output stream. | + | Denumirea de **iostream** provine de la standard input-output stream. |
In C++, cele doua metode fundamentale pentru a citi si, respectiv, a scrie, sunt **cin** si **cout**. | In C++, cele doua metode fundamentale pentru a citi si, respectiv, a scrie, sunt **cin** si **cout**. | ||
<note>**cin**: | <note>**cin**: | ||
- | *este o instanta a clasei **istream** si se foloseste pentru a citi input-ul de la o sursa (sursa standard este tastatura). | + | |
- | *este urmat de operatorul de extractie (>>), care extrage inputul din obiectul cin, introdus de la tastatura. | + | Este o instanta a clasei **istream** si se foloseste pentru a citi input-ul de la o sursa (sursa standard este tastatura). Este urmat de operatorul de extractie (>>), care extrage inputul din obiectul cin, introdus de la tastatura. |
</note> | </note> | ||
<note>**cout**: | <note>**cout**: | ||
- | este o instanta a clasei *ostream* si se foloseste pentru a introduce date in dispozitivul de output (de obicei ecranul). | + | |
- | Utilizand operatorul de insertie (<<) datele sunt introduse in stream-ul de output (cout) pentru a aparea pe ecran. | + | Este o instanta a clasei **ostream** si se foloseste pentru a introduce date in dispozitivul de output (de obicei ecranul). |
+ | Utilizand operatorul de insertie (**<<**) datele sunt introduse in stream-ul de output (cout) pentru a aparea pe ecran. | ||
</note> | </note> | ||
- | Operatorii << si >> sunt definiti dupa cum urmeaza : | + | Operatorii **<<** si **>**> sunt definiti dupa cum urmeaza: |
+ | |||
+ | ostream &operator<< (ostream &, consttip_de_baza &); | ||
+ | |||
+ | istream &operator>> (istream &, tip_de_baza &); | ||
- | ostream& operator<< (ostream&, consttip_de_baza&); | + | Acestia pot fi supradefiniti pentru tipuri de date definite de utilizator: |
- | istream& operator>> (istream& ,tip_de_baza&); | + | |
+ | friend ostream& operator<< (ostream&, constTIP &); | ||
+ | friend istream& operator>> (istream&, TIP &); | ||
+ | |||
+ | Pe langa operatorii << si >>, clasele istream si ostream au implementate functiile elementare **get** si **put** | ||
+ | |||
+ | ostream& put (char c); | ||
+ | istream& get (char& c); | ||
+ | |||
+ | == Exemplu == | ||
+ | |||
+ | char ch; | ||
+ | cin.get(ch); | ||
+ | cout.put(ch); | ||
- | Acestia pot fi supradefiniti pentru tipuri de date definite de utilizator : | + | ==Functii de citire/modificare a starii:== |
+ | |||
+ | | obool bad(); | arata daca a existat o eroare la efectuarea ultimei operatii | | ||
+ | | bool good(); | arata daca ultima operatie s-a efectuat cu succes | | ||
+ | | void clear(); | sterge indicatorii de eroare | | ||
+ | |||
+ | == Manipulatori == | ||
+ | |||
+ | <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 << ....; | ||
- | friend ostream& operator<< (ostream&, constTIP &); | + | Exemplu: |
- | friend istream& operator>> (istream&, TIP &); | + | cout << hex << 10 << endl << 11;//OUTPUT: a b |
+ | cin >> oct >> i; // i va fi citit de la consola in baza 8 | ||
- | Pe langa operatorii << si >>, clasele istream si ostream au implementate functiile elementare *get* si *put* | + | Manipulatorii fara parametri sunt: |
- | ostream& put (char c); | + | -dec (specifica baza10) |
- | istream& get (char& c); | + | -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* | + | 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; | ||
- | char ch; | + | Manipulatori cu parametri (definiti in **iomanip.h**): |
- | cin.get(ch); | + | |
- | cout.put(ch); | + | |
- | + | ||
- | Functii de citire/modificare a starii: | + | |
- | + | ||
- | bool bad(); -> arata daca a existat o eroare la efectuarea ultimei operatii | + | |
- | bool good(); -> arata daca ultima operatie s-a efectuat cu succes | + | |
- | void clear(); -> sterge indicatorii de eroare | + | |
- | == Manipulatori == | + | 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 === | ||
+ | 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) | ||
+ | nume - numele fisierului | ||
+ | mod - modul de acces | ||
+ | acces - tipul de protectie/acces | ||
+ | |||
+ | Exemplu: | ||
+ | ofstream ofis("date1.txt",ios::app); | ||
- | 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. | + | Modurile (preferinite in clasa ios) sunt: |
+ | *ios::in - intrare | ||
+ | *ios::out - iesire | ||
+ | *ios::ate - deschidere cu pozitionare la sfarsitul fisierului | ||
+ | *ios::app - append, adaugare la sfarsitul fisierului | ||
+ | *ios::binary - deschidere in mod binar | ||
- | Sintaxa: | + | <note>Modurile pot fi combinate cu SAU logic la nivel de bit (|) |
- | cout << manipulator << ....; | + | **Acces** |
+ | *0 - normal | ||
+ | *1 - read-only | ||
+ | *2 - hidden | ||
+ | *3 - sistem | ||
+ | </note> | ||
+ | |||
+ | Se poate folosi si functia cu efect similar: | ||
+ | void open (const char *nume_fisier, int mod, int acces) | ||
- | Exemplu : | + | In urma deschiderii, este indicata testarea pentru erori: |
- | cout << hex << 10 << endl << 11;//OUTPUT: a b | + | 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. | ||
- | cin >> oct >> i; // i va fi citit de la consola in baza 8 | + | Putem citi o linie dintr-un fisier text (sau cin) cu functia: |
+ | 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. | ||
- | Manipulatorii fara parametri sunt : | + | Exemplu: |
+ | ifstream ifis("date2.dat"); | ||
+ | char buf[256]; | ||
+ | while(!ifis.eof()) { | ||
+ | ifis.getline(buf, 256, '\n'); | ||
+ | cout << buf << endl; | ||
+ | } | ||
- | -dec(specifica baza10) | + | <note important>A se consulta cursul pentru mai multe exemple!</note> |
- | -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; | + | ==Fisiere binare== |
- | cin>>hex>>x;//F | + | |
- | cout<<dec<<x;//15 | + | |
+ | In cazul fisierelor binare, nu se pot folosi functiile obisnuite de citire/scriere deoarece datele nu sunt formatate in vreun fel anume. | ||
- | string s,s1; | + | Clasele specializate pentru fisiere binare includ doua functii pentru citirea si scrierea secventiala: |
- | cin>>ws>>s; // introducde la tastatura textul: ”xx yy zz” | + | -**write** |
- | cout<<s; //xx | + | -**read** |
- | cin>>s1; //fara sa scriu ceva de la tastatura, in s1 se citeste in continuare yy | + | |
- | cout<<s1; //yy | + | istream& read(unsigned char *buf, intn); |
- | cout<<flush; | + | ostream& write(constunsigned char *buf, intn); |
- | Manipulatori cu parametri (definiti in iomanip.h) | + | Functiile citesc/scriu din/in fisierul respectiv **n octeti** in/din buf |
- | setprecision(int n) - (pentru numerele reale) precizia este setata la n zecimale | + | Pozitionarea absoluta in fisierul binar este realizata de metodele **seekg** (citire din **ifstream**) si **seekp** (scriere in **ofstream**): |
- | setw(int n) - seteaza latimea campului pentru afisare la n | + | |
- | setfill(char ch) - selecteaza caracterul de umplere (completeaza pozitiile libere din camp) | + | ifstream& seekg(long poz, int reper); |
+ | ofstream& seekp(long poz, int reper); | ||
+ | poz = pozitia in octeti | ||
+ | Reper poate fi una dintre constantele: | ||
+ | ios::beg (pozitionare fata de inceput) | ||
+ | ios::cur (fata de pozitia curenta) | ||
+ | ios::end (fata de sfarsit) |