Sunteți pe pagina 1din 8

1

CLASA A IX-A
CURS: LIMBAJUL BORLAND C++

1.7 CITIREA I SCRIEREA DATELOR


S T R E A M -

u r i

Datele pot avea urmtoarele trasee:


sursa: tastatura dest: monitor
sursa: tastatura dest:
fisier
sursa:
fiier dest: monitor
sursa:
fiier dest:
fiier
Def: Acest flux de date de la o surs ctre o destinaie poart numele de stream.
De ce este important noiunea de stream ? Deoarece observm c indiferent de tipul
sursei sau al destinaiei schimbul se realizeaz.

1.Elementele ce caracterizeaz strem-ul


1. Sensul deplasrii datelor - stream-uri de intrare (citire)
sursa: oarecare (nu variabila) dest: variabil
- stream-uri de ieire (scriere)
sursa: variabila dest: oarecare (nu variabil)
- stream-uri de intrare/ieire (citire/scriere)
sursa: variabila dest: variabil
2. Natura sursei (destinaiei)
Stream-uri de intrare:
istrem-uri
sursa: tastatura
ifstream-uri
sursa: fiier oarecare
Stream-uri de ieire:
ostrem-uri
dest: monitorul
ofstream-uri dest: fiier oarecare
3. Un stream este un obiect - utilizarea impune folosirea fiierului <iostream.h> (ca i <ios.h>)
4. Un stream poate efectua orice tip de conversie permis n C++ . Conversiile se fac:
implicit (nu mai trebuie specificat tipul datei) sau
explicit (prin utilizarea metodelor specifice)
n continuare vom studia pentru nceput stream-urile de intrare i ieire standard istream
i ostream. ATENIE tot ce nvm la ele este valabil i pentru fiiere. De ce? datorit
motenirii.

2.Strem-uri de intrare i de ieire standard


Fiierul <iostream.h> conine definiia urmtoarelor obiecte:
cin - face parte din clasa istream ce definete un stream de intrare

2
cout - face parte din clasa ostream ce definete un stream de ieire
OBS: Citirile i scrierile se pot face folosind obiectele cin i cout.
2.1.Citiri i scrieri fr format
n C pentru scrieri i citiri se folosesc funciile printf i scanf cu care nu se pot scrie/citi
date fr a utiliza formate. Nu este cazul de fa, obiectele cin i cout vor permite acest lucru.
Pentru citire se va folosi operatorul ">>" i pentru scriere se va folosi op. "<<". n cazul
scrierii construcia endl face posibil trecerea la o linie nou.
Variabile de tip char (citire/scriere):
Citire : se citete primul caracter care nu este alb
Scriere: se tiprete caracterul de pe poziia curent
Ex: include<iostream.h>
void main(void)
{
char a,b,c;
cin>>a;
cout<<a;
cin>>a>>b>>c;
cout<<a<<b<<endl<<c;
}
EROARE cin>>a<<b;

//daca tastm 'a' se tip 'a'


//daca tastm '
a' se tip 'a'
//se cit val pentru a, apoi b, apoi c
//se afieaz var a i b iar pe urmt. linie c

Variabile numerice (citire/scriere):


Citire : se face ncepnd cu poziia curent; se sare peste caracterele albe; citirea se face
pn cnd este ntlnit un caracter ce nu poate face parte din acel tip de
dat
Scriere: se face ncepnd cu poziia curent curent
Ex: include<iostream.h> dac se tasteaz 12 se tip 12
void main(void)
dac se tasteaz ' 17ab' se tip 17
{ int n;
dac se tasteaz 123.78 se tip 123
cin>>n;
cout<<n;

Ex:

}
include<iostream.h>
void main(void)
{ int a;double b;
cin>>a>>b;
cout<<a<<" "<<b;}

dac se tasteaz ' 12


54.89' se tip 12 54.89
dac se tasteaz 123.45 se tiprete 123 0.45

iruri de caractere (citire/scriere):


Citire : Se face ncepnd cu poziia curent; se sare peste caracterele albe; citirea se face
pn cnd este ntlnit un caracter alb
irului astfel obinut i se adaug caracterul nul, dup care este memorat.
Scriere: se face ncepnd cu poziia curent pn este ntlnit caracterul nul.
Ex: include<iostream.h>

void main(void)
{
char sir[20];
cin>>sir;
cout<<sir;
}

3
dac se tasteaz acesta este un text
se va afia
acesta

n continuare vom vedea cum tratm erorile generate de aceste obiecte.


2.2.Tratarea erorilor
Presupunem c dorim s citim o variabil de tip int. Din greeal sau intenionat
introducem un ir care ncepe cu o liter, n acest caz citirea eueaz:
#include<iostream.h> Dac se introduce x89 se va afia 2t3. De ce?
void main(void)
- var a nu a putut fi citit('x' nu este numr) i atunci valoarea
{
ei anterioar rmne aceeai (adic a = 2)
int a=2,b=3;
- toate citirile sunt blocate din aceast cauz, deci b i c
char c='t';
cin>>a>>b>>c;
rmn nemodificate
cout<<a<<c<<b;

Clasa ios definete 5 constante, astfel:

enum io_state
goodbit
eofbit
failbit
badbit
hardfail
};

=
=
=
=
=

0x00;
0x01;
0x02;
0x04;
0x80;

//operaia de intrare/ieire a reuit


//s-a ntlnit caracterul de sf de fiier(EOF)
//s-a produs o eroare reparabil
//eroare ireparabil
//eroare hard

(0)
(1)
(2)
(4)
(128)

Variabila state din clasa ios reine modul n care s-a efectuat ultima operaia de
intrare/ieire, astfel:
Dac "operaia s-a efectuat corect"
atunci state = 0
altfel
state = valoarea corespunztoare const. de mai sus
Coninutul variabilei state poate fi obinut cu ajutorul metodei rdstate() a clasei ios:

int rdstate()
Ex: 1)

#include<iostream.h>
void main(void)
{
int a;
cin>>a;
cout<<cin.rdstate;
}

- dac se introduce 1 se tiprete 0


(citire corect)
- dac se introduce 's' se tiprete 2
(eroare reparabil)
- dac se introduce ^Z se tiprete 3
(sf de fiier + eroare reparabil)

Ex: 2) Se introduc numere pn la apsarea caracterului ^Z, se cere s se afieze numerele pare
introduse
#include<iostream.h>
#include<conio.h>

4
void main(void)
{
int a;
clrscr();
while (cin>>a,cin.rdstate() == 0)
if (a%2 == 0) cout<<a<<" ";
}

Condiia din while conine dou expresii: prima citete o valoare n a, iar cea de-a doua verific
dac citirea a fost corect. Ct timp citirea este corect se execut instruciunea de verificare
dac acel numr este par sau nu.
Am vzut c prin cin>>a>>b>>c; variabilele b i c pot fi iniializate prin citire numai
dac citirea variabilei a este corect. Clasa ios mai conine metoda:
void clear ( int = 0 )
ce permite setarea variabilei state cu o valoare. Dac parametrul lipsete aceast valoare este 0.
Ex: 1)

#include<iostream.h>
void main(void)
Dac se introduce x9 se tiprete 2x9 deoarece variabila a nu a
{
fost citit (ea va avea valoarea cu care a fost iniializat, adic 2),
int a = 2,b = 3;
dar b i c au fost citite.
char c = 't';
cin>>a;
cin.clear();
cin>>b>>c;
cout<<a<<b<<c;
}

Ex: 2) Analizai programul urmtor:

#include<iostream.h>
void main(void)
{
int a;
char c;
while(cin>>a,cin.rdstate())
cin.clear(),cin>>c;
}

Expresia cin>>a,cin.rdstate() se evalueaz


de la stnga la dreapta, deci se ncearc citirea variabilei
a, dac tentativa reuete atunci STOP (cin.rdstate() ==
0), altfel variabila state = 0 i caracterul de pe poziia
curent este atribuit variabilei c. Procedeul se repet
pn cnd n a va fi citit primul numr introdus.
Dac se introduce abc34sr56 o variabila a = 34.

Clasa ios mai conine urmtoarele metode utile n tratarea erorilor:


int fail() - dac operaia de intrare/ieire a euat
atunci returneaz val. 0
altfel returneaz val = 0
int good() - dac operaia de intrare/ieire a reuit
atunci returneaz val. 0
altfel returneaz val = 0
#include<iostream.h>//aplicaia numr cte numere ntregi s-au introdus
#include<conio.h>
void main(void)

5
{ int a,n;
clrscr();
n=0;
while (cin>>a,cin.good()) n++;
cout<<"Ati introdus "<<n<<" numere";
getch();}

6
2.1.Citiri i scrieri cu format

<iomanip.h>

Este comod s efectum citiri i scrieri fr format dar aceast modalitate uneori este
insuficient. n C++ este posibil s efectum citiri/scrieri cu format fr a utiliza funciile printf
i scanf.
CITIRE:

cin >>manipulator_1>>...>>manipulator_n>>variabil

SCRIERE: cout <<manipulator_1<<...<<manipulator_n<<variabil | constant


unde variabil | constant - nume_de_var sau nume_de_const sau o constant
manipulatori - sunt funcii de sistem ce pot fi apelate n stream-uri la citire/scriere (pentru
aceasta trebuie apelat n program fiierul iomanip.h)

Manipulatori specifici operaiei de scriere:


Manipulator
setprecision(x)
setw(x)
setfill(x)

Tip x
int

Acces la var de mem sistem:


x_precision

int

x_width

char

x_fill

Scop
Stabilete numrul de
zecimale (x) pt. un
nr. real
nr. de poz. pe care se
face afiarea
stabilete care este
car.de umplere folosit

Ex:

#include<iostream.h>
#include<iomanip.h>
void main(void)
{ float a = 0.123456;
cout<<setprecision(2)<<setw(5)<<setfill('f')<<a;
}
Se va afia pe ecram: f0.12

Manipulatori:
Manipulator

Acces la
variabila de mem. sistem:
setioflags(masca)
seteaz
x_flags
resetioflags(masca)

unde masca ase formeaz astfel:

x_flags

Scop

biii
masc (val. 1)
seteaz
biii
masc (val. 0)

ios::const_1 | ... | ios::const_n

precizai

precizai

7
unde cont_1...const_n sunt constante simbolice cu anumite efecte asupra datelor,
explicate n tabelul urmtor:
Constanta Const. simbolic
Semnificaie
0x0001
skipws
caracterele albe care preced valoarea sunt ignorate
0x0002
left
afiarea datelor se face cu aliniere la stnga
0x0004
right
afiarea datelor se face cu aliniere la dreapta
0x0008
internal
dac spaiul unde se va afia numrul este mai mare atunci
semnul va fi aliniat la stnga i numrul la dreapta
0x0010
dec
conversie n zecimal
0x0020
oct
conversie n octal
0x0040
hex
conversie n hexazecimal
0x0080
showbase
se utilizeaz indicatorul bazei de numeraie
0x0100
showpoint
Nr. real se afieaz cu punct chiar dac acestea are val. ntreag
0x0200
uppercase
se folosesc litere mari pt. sistemul hexa
0x0400
showpos
pentru val. numerice pozitive se afieaz semnul '+'
0x0800
scientific
pentru nr. reale se folosete notaia tiinific
0x1000
fixed
pentru date reale se afieaz n forma normal(-343.5656)
urmtorii manipulatori pot fi folosii i fr masc:
Manipulator
Efect
oct
conversie n octal
dec
conversie n zecimal
hex
conversie n hexazecimal
Ex:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void main(void)
{
int n;
float m;
clrscr();
cout<<setw(5)<<"n= ";cin>>n;
cout<<setw(5)<<"m= ";cin>>m;
cout<<"Numarul n in baza 16 este: ";
cout<<setw(10)<<setiosflags(ios::hex|ios::uppercase|ios::right|
ios::showbase)<<n<<endl;
cout<<"Numarul n in baza 8 este: ";
cout<<setw(10)<<oct<<setiosflags(ios::right|ios::showbase)<<n<<endl;
cout<<"Numarul m scris cu E este: ";
cout<<setw(10)<<setiosflags(ios::scientific)<<m;
getch();
}
Dac se introduc valorile n = 12 i m = 9.8 se va afia:

Numarul n in baza 16 este:


Numarul n in baza 8 este:

0XA
012

8
Numarul m scris cu E este:
9.7E+00
Toate informaiile oferite mai sus sunt valabile i pentru fiiere.