This shows you the differences between two versions of the page.
poo-is:laboratoare:10 [2020/10/04 19:53] ruben_gilian.udroiu [3. Stream] |
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: | ||
+ | |||
+ | ostream &operator<< (ostream &, consttip_de_baza &); | ||
+ | | ||
+ | istream &operator>> (istream &, tip_de_baza &); | ||
+ | |||
+ | Acestia pot fi supradefiniti pentru tipuri de date definite de utilizator: | ||
+ | |||
+ | 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); | ||
+ | |||
+ | ==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 << ....; | ||
+ | |||
+ | Exemplu: | ||
+ | cout << hex << 10 << endl << 11;//OUTPUT: a b | ||
+ | cin >> oct >> i; // i va fi citit de la consola in baza 8 | ||
+ | |||
+ | Manipulatorii fara parametri sunt: | ||
+ | |||
+ | -dec (specifica baza10) | ||
+ | -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; | ||
+ | |||
+ | 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 === | ||
+ | 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); | ||
+ | |||
+ | 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 | ||
+ | |||
+ | <note>Modurile pot fi combinate cu SAU logic la nivel de bit (|) | ||
+ | |||
+ | **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) | ||
+ | |||
+ | In urma deschiderii, este indicata testarea pentru erori: | ||
+ | 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. | ||
+ | |||
+ | 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. | ||
+ | |||
+ | Exemplu: | ||
+ | ifstream ifis("date2.dat"); | ||
+ | char buf[256]; | ||
+ | while(!ifis.eof()) { | ||
+ | ifis.getline(buf, 256, '\n'); | ||
+ | cout << buf << endl; | ||
+ | } | ||
+ | |||
+ | <note important>A se consulta cursul pentru mai multe exemple!</note> | ||
+ | |||
+ | ==Fisiere binare== | ||
+ | |||
+ | 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** | ||
+ | -**read** | ||
+ | |||
+ | istream& read(unsigned char *buf, intn); | ||
+ | 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**): | ||
+ | |||
+ | 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) |