Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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)
poo-is/laboratoare/10.1601830384.txt.gz · Last modified: 2020/10/04 19:53 by ruben_gilian.udroiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0