Sunteți pe pagina 1din 7

1 CLASA A IX-A CURS: LIMBAJUL BORLAND C++ prof.

Adriana Kentsch

1.7 CITIREA I SCRIEREA DATELOR


S T R E A M 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. u r i

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)

2 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 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 { dac se tasteaz 123.78 se tip 123 int n;
cin>>n; cout<<n; } include<iostream.h>

Ex:

dac se tasteaz ' 12

54.89' se tip 12 54.89

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

3 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) dac se tasteaz acesta este un text { se va afia acesta char sir[20];
cin>>sir; cout<<sir; }

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; }

enum io_state goodbit eofbit failbit badbit hardfail };

Clasa ios definete 5 constante, astfel:


{ = = = = = 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

4 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> 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;

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() ==

char c; 0), altfel variabila state = 0 i caracterul de pe poziia while(cin>>a,cin.rdstate()) curent este atribuit variabilei c. Procedeul se repet cin.clear(),cin>>c; }

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) { int a,n; clrscr(); n=0; while (cin>>a,cin.good()) n++; cout<<"Ati introdus "<<n<<" numere"; getch();}

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)

Tip x int int

Acces la var de mem sistem: x_precision x_width

Scop
Stabilete numrul de zecimale (x) pt. un nr. real nr. de poz. pe care se face afiarea

6
setfill(x)

char

x_fill

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:
Acces la variabila de mem. sistem: setioflags(masca) seteaz x_flags
resetioflags(masca)

Manipulator

Scop
precizai precizai n n

x_flags

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

unde masca ase formeaz astfel:

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

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

7
dec hex

conversie n zecimal 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: Numarul m scris cu E este:

0XA 012 9.7E+00

Toate informaiile oferite mai sus sunt valabile i pentru fiiere.

S-ar putea să vă placă și