Extras din curs
Operatii de intrare / iesire în C++ .
Ca si în C, în C++ facilitatile de intrare / iesire sunt implementate prin intermediul unei biblioteci de functii.
Pe nivelul cel mai de jos, un fisier este interpretat ca un flux de octeti (stream).
Pe nivelul utilizator, fisierul consta dintr-o secventa de tipuri amestecate de date: caractere, valori aritmetice, obiecte.
Biblioteca de functii de intrare / iesire realizeaza interfata între cele doua niveluri.
În biblioteca este predefinit un set de operatii pentru citirea si scrierea unor tipuri predefinite.
Aceste operatii pot fi extinse de catre programator pentru tipurile de date definite de catre utilizator (clase).
Operatiile de intrare sunt suportate de clasa istream, cele de iesire – de clasa ostream.
Scrierea în fluxul de iesire (insertie) se realizeaza cu operatorul << ( << x – preia date din x).
Citirea din fluxul de intrare (extractie) se realizeaza cu operatorul >> ( >>x – pune date in x).
Sunt predefinite 4 fluxuri de date: cin – obiect din clasa istream, legat de intrarea standard, cout – obiect din clasa ostream, legat de iesirea standard, cerr – obiect din clasa ostream legat de iesirea standard de eroare nebuferata si clog – legat de iesirea standard de eroare buferata.
Intrarile / iesirile standard folosesc obiectele cin, cout si cerr, initializate prin includerea fisierului antet iostream.h.
1. Iesirea standard.
Se realizeaza folosind operatorul de inserare << (depune în flux). Acest operator este predefinit pentru tipurile: caracter, întregi, reali, siruri de caractere, pointeri. Operatorul poate fi supraîncarcat pentru tipurile utilizator (tipuri abstracte). Exemple:
#include <iostream.h>
int n=10;
cout << n << “n”; // acelasi efect are printf(“%dn”, n);
char c=’A’;
cout << c << “n”; // similar cu printf(“%cn”, c);
Pentru realizarea unor facilitati de formatare, în C++ seutilizeaza indicatori de format (flaguri), care contin într-o data membru al clasei ios bitii cu semnificatiile urmatoare:
enum {
skipws =0x0001, // salt peste spatii albe
left =0x0002, // alinierea iesirii la stinga
right =0x0004, // alinierea iesirii la dreapta
internal =0x0008,
dec =0x0010, // conversie in zecimal
oct =0x0020, // conversie in octal
hex =0x0040, // conversie in hexazecimal,
showbase =0x0080, // se afiseaza baza
showpoint =0x0100, // se afiseaza punctul zecimal
uppercase =0x0200, // se afiseaza cu litere mari
showpos =0x0400, // intregii pozitivi sunt afisati cu +
scientific=0x0800, // realii se afiseaza cu exponent
fixed =0x1000, // realii se afiseaza fara exponent
unitbuf =0x2000, // se goleste zona tampon pentru iesiri
stdio =0x4000, // dupa fiecare iesire se videaza stdout
};
În absenta indicatiilor de formatare, se face o formatare implicita, în baza 10, cu aliniere la dreapta în câmpul de iesire.
Pentru a realiza o formatare definita de utilizator, diferita de cea implicita, se pot seta bitii membrului indicator cu functiile:
long setf(long f); // seteaza indicatorii, intoarce vechiul format
long setf(long b, long g);//seteaza bitul specificat din grupa
Bitii indicatorului de format se împart în 3 grupe:
1) aliniere (adjustfield) cu bitii right, left si internal
2) baza (basefield) cu bitii dec, oct, hex
3) exponent (floatfield) cu bitii scientific si fixed.
Într-o grupa poate fi setat un singur indicator.
int width(); // returneaza latimea zonei de afisare
int width(int w); // modifica la w, latimea zonei de afisare
Implicit, latimea minima a zonei de afisare este 0; ea poate fi extinsa automat pentru a permite afisarea datei cu toate cifrele.
Daca numarul de caractere al datei este mai mic decât latimea minima a zonei de afisare, se face aliniere la dreapta, completata la stânga cu spatii libere.
Caracterul de umplere (cu care se completeaza latimea minima a zonei de afisare poate fi definit prin:
char fill(); // intoarce codul caracterului de umplere curent
char fill(char c); //defineste un nou caracter de umplere
Numarul de zecimale cu care se afiseaza un numar real (precizia) poate fi setat cu:
int precision(); //intoarce precizia curenta
int precision(int n); // modifica precizia la n cifre,
// intoarce vechea precizie
Exemple:
int i=25;
cout.width(10);
cout.setf(ios::left,ios::adjustfield);
cout.fill(‘0’);
cout.setf(ios::showpos);
cout.setf(ios::hex,ios::basefield);
cout << i << endl;
double x=123.456;
cout.setf(ios::scientific,, ios::floatfield);
cout.precision(5);
cout << x << endl;
2. Manipulatori.
Permit definirea formatelor pentru operatiile de intrare / iesire, într-un mod mai simplu decât o fac indicatorii de format.
Exista urmatorii manipulatori:
dec – indicator de conversie zecimal
oct – indicator de conversie octal
hex – indicator de conversie hexazecimal
ws – setare salt peste spatii albe
endl – insereaza linie noua si goleste tamponul fluxului
ends – insereaza caracterul nul de terminare a unui sir de caractere
flush – goleste tamponul fluxului
setbase(int n) - seteaza baza(n = 0, 8, 10, 16)
resetiosflags(long x) – sterge bitii de format specificati
setiosflags(long x) – seteaza bitii de format specificati
setfill(int n) – seteaza caracterul de umplere
setprecision(int n) – seteaza precizia
setw(int w) – setarea latimii câmpului de afisare
Pentru a folosi manipulatori se include fisierul iomanip.h
Exemple:
int i = 12345;
cout << setw(10) << resetiosflags(ios::internal|ios::left) <<
setiosflags(ios::right) << setfill(‘0’) <<
setiosflags(ios::showpos) << i;
double x = 2.718281;
cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific)
<< setprecision(10) << x;
Preview document
Conținut arhivă zip
- Operatii de intrare si iesire in C si C++.doc