lectie1.6

9
CLASA A IX-A CURS : LIMBAJUL BORLAND C++ 1.7 CITIREA ŞI SCRIEREA DATELOR STREAM- uri STREAM- uri Datele pot avea următoarele trasee: sursa: tastatura → dest: monitor sursa: tastatura → dest: fisier sursa: fişier → dest: monitor sursa: fişier → dest: fişier Def: Acest flux de date de la o sursă către o destinaţie poartă numele de stream. De ce este importantă noţiunea de stream ? Deoarece observăm că indiferent de tipul sursei sau al destinaţiei schimbul se realizează. 1.Elementele ce caracterizează strem-ul 1. Sensul deplasării datelor - stream-uri de intrare (citire) sursa: oarecare (nu variabila) → dest: variabilă - stream-uri de ieşire (scriere) sursa: variabila → dest: oarecare (nu variabilă) - stream-uri de intrare/ieşire (citire/scriere) sursa: variabila → dest: variabilă 2. Natura sursei (destinaţiei) Stream-uri de intrare : istrem-uri sursa: tastatura ifstream-uri sursa: fişier oarecare Stream-uri de ieşire : ostrem-uri dest: monitorul ofstream-uri dest: fişier oarecare 3.Un stream este un obiect - utilizarea impune folosirea fişierului <iostream.h> (ca şi <ios.h>) 1

description

lectie6

Transcript of lectie1.6

Page 1: lectie1.6

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

1.7 CITIREA ŞI SCRIEREA DATELORS T R E A M - u r iS T R E A M - u r i

Datele pot avea următoarele trasee:sursa: tastatura → dest: monitorsursa: tastatura → dest: fisiersursa: fişier → dest: monitorsursa: fişier → dest: fişier

Def: Acest flux de date de la o sursă către o destinaţie poartă numele de stream.De ce este importantă noţiunea de stream ? Deoarece observăm că indiferent de tipul

sursei sau al destinaţiei schimbul se realizează.1 . E l e m e n t e l e c e c a r a c t e r i z e a z ă s t r e m - u l1. Sensul deplasării datelor - stream-uri de intrare (citire)

sursa: oarecare (nu variabila) → dest: variabilă - stream-uri de ieşire (scriere)

sursa: variabila → dest: oarecare (nu variabilă) - stream-uri de intrare/ieşire (citire/scriere)

sursa: variabila → dest: variabilă2. Natura sursei (destinaţiei)

Stream-uri de intrare: istrem-uri sursa: tastatura ifstream-uri sursa: fişier oarecare

Stream-uri de ieşire: ostrem-uri dest: monitorul ofstream-uri dest: fişier oarecare

3. Un stream este un obiect - utilizarea impune folosirea fişierului <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 ieşire standard istream şi ostream. ATENŢIE tot ce învăţăm la ele este valabil şi pentru fişiere. De ce? datorită moştenirii.2 . S t r e m - u r i d e i n t r a r e ş i d e i e ş i r e s t a n d a r d

Fişierul <iostream.h> conţine definiţia următoarelor obiecte: cin - face parte din clasa istream ce defineşte un stream de intrare cout - face parte din clasa ostream ce defineşte un stream de ieşire

1

Page 2: lectie1.6

OBS: Citirile şi scrierile se pot face folosind obiectele cin şi cout.

2.1.Citiri şi scrieri fără formatÎn C pentru scrieri şi citiri se folosesc funcţiile printf şi scanf cu care nu se pot scrie/citi

date fără 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 construcţia endl face posibilă trecerea la o linie nouă.Variabile de tip char (citire/scriere):

Citire : se citeşte primul caracter care nu este alb Scriere: se tipăreşte caracterul de pe poziţia curentă

Ex: include<iostream.h>void main(void){ char a,b,c; cin>>a; //daca tastăm 'a' se tip 'a' cout<<a; //daca tastăm ' a' se tip 'a' cin>>a>>b>>c; //se cit val pentru a, apoi b, apoi c cout<<a<<b<<endl<<c; //se afişează var a şi b iar pe următ. linie c}

EROARE cin>>a<<b;Variabile numerice (citire/scriere):

Citire : se face începând cu poziţia curentă; se sare peste caracterele albe; citirea se face până când este întâlnit un caracter ce nu poate face parte din acel tip de

dată Scriere: se face începând cu poziţia curentă curentă

Ex: include<iostream.h>void main(void){ int n;

cin>>n; cout<<n;}

dacă se tastează 12 se tip 12 dacă se tastează ' 17ab' se tip 17 dacă se tastează 123.78 se tip 123

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 tipăreşte 123 0.45

Şiruri de caractere (citire/scriere): Citire : Se face începând cu poziţia curentă; se sare peste caracterele albe; citirea se face

până când este întâlnit un caracter alb Şirului astfel obţinut i se adaugă caracterul nul, după care este memorat.

Scriere: se face începând cu poziţia curentă până este întâlnit caracterul nul.Ex: include<iostream.h>

void main(void){ char sir[20];

cin>>sir;

dacă se tastează acesta este un text se va afişa acesta

2

Page 3: lectie1.6

cout<<sir;}

În continuare vom vedea cum tratăm erorile generate de aceste obiecte.

2.2.Tratarea erorilorPresupunem că dorim să citim o variabilă de tip int. Din greşeală sau intenţionat

introducem un şir care începe cu o literă, în acest caz citirea eşuează:#include<iostream.h>void main(void){ int a=2,b=3; char c='t'; cin>>a>>b>>c; cout<<a<<c<<b;}

Dacă se introduce x89 se va afişa 2t3. De ce?- var a nu a putut fi citită('x' nu este număr) şi atunci valoarea

ei anterioară rămâne aceeaşi (adică a = 2)- toate citirile sunt blocate din această cauză, deci b şi c

rămân nemodificate

Clasa ios defineşte 5 constante, astfel:enum io_state {

goodbit = 0x00; //operaţia de intrare/ieşire a reuşit (0)eofbit = 0x01; //s-a întâlnit caracterul de sf de fişier(EOF) (1)failbit = 0x02; //s-a produs o eroare reparabilă (2)badbit = 0x04; //eroare ireparabilă (4)hardfail = 0x80; //eroare hard (128)};Variabila state din clasa ios reţine modul în care s-a efectuat ultima operaţia de

intrare/ieşire, astfel:Dacă "operaţia s-a efectuat corect" atunci state = 0 altfel state = valoarea corespunzătoare const. de mai sus

Conţinutul variabilei state poate fi obţinut 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 tipăreşte 0 (citire corectă)- dacă se introduce 's' se tipăreşte 2 (eroare reparabilă)- dacă se introduce ^Z se tipăreşte 3 (sf de fişier + eroare reparabilă)

Ex: 2) Se introduc numere până la apăsarea caracterului ^Z, se cere să se afişeze numerele pare introduse#include<iostream.h>#include<conio.h>void main(void) { int a; clrscr();

3

Page 4: lectie1.6

while (cin>>a,cin.rdstate() == 0) if (a%2 == 0) cout<<a<<" ";}Condiţia din while conţine două expresii: prima citeşte o valoare în a, iar cea de-a doua verifică dacă citirea a fost corectă. Cât timp citirea este corectă se execută instrucţiunea de verificare dacă acel număr este par sau nu.

Am văzut că prin cin>>a>>b>>c; variabilele b şi c pot fi iniţializate prin citire numai dacă citirea variabilei a este corectă. Clasa ios mai conţine metoda:

void clear ( int = 0 ) ce permite setarea variabilei state cu o valoare. Dacă parametrul lipseşte această valoare este 0.

Ex: 1)#include<iostream.h>void main(void){ int a = 2,b = 3; char c = 't'; cin>>a; cin.clear(); cin>>b>>c; cout<<a<<b<<c;}

Dacă se introduce x9 se tipăreşte 2x9 deoarece variabila a nu a fost citită (ea va avea valoarea cu care a fost iniţializată, adică 2), dar b şi c au fost citite.

Ex: 2) Analizaţi programul următor:#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 stânga la dreapta, deci se încearcă citirea variabilei a, dacă tentativa reuşeşte atunci STOP (cin.rdstate() == 0), altfel variabila state = 0 şi caracterul de pe poziţia curentă este atribuit variabilei c. Procedeul se repetă până când în a va fi citit primul număr introdus. Dacă se introduce abc34sr56 o variabila a = 34.

Clasa ios mai conţine următoarele metode utile în tratarea erorilor: int fail() - dacă operaţia de intrare/ieşire a eşuat

atunci returnează val. 0altfel returnează val = 0

int good() - dacă operaţia de intrare/ieşire a reuşitatunci returnează val. 0altfel returnează val = 0

#include<iostream.h>//aplicaţia numără câte 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";

4

Page 5: lectie1.6

getch();}5

Page 6: lectie1.6

2.1.Citiri şi scrieri cu format <iomanip.h>

Este comod să efectuăm citiri şi scrieri fără format dar această modalitate uneori este insuficientă. În C++ este posibil să efectuăm citiri/scrieri cu format fără a utiliza funcţiile 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 funcţii de sistem ce pot fi apelate în stream-uri la citire/scriere (pentru

aceasta trebuie apelat în program fişierul iomanip.h)Manipulatori specifici operaţiei de scriere :

Manipulator Tip x Acces la var de mem sistem: Scopsetprecision(x) int x_precision Stabileşte numărul de

zecimale (x) pt. un nr. real

setw(x) int x_width nr. de poz. pe care se face afişarea

setfill(x) char x_fill stabileşte 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 afişa pe ecram: f0.12

Manipulatori:

Manipulator Acces la variabila de mem. sistem:

Scop

setioflags(masca) x_flags setează biţii precizaţi în mască (val. 1)

resetioflags(masca) x_flags setează biţii precizaţi în 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 următor:

6

Page 7: lectie1.6

Constanta Const. simbolică Semnificaţie0x0001 skipws caracterele albe care preced valoarea sunt ignorate0x0002 left afişarea datelor se face cu aliniere la stânga0x0004 right afişarea datelor se face cu aliniere la dreapta0x0008 internal dacă spaţiul unde se va afişa numărul este mai mare atunci

semnul va fi aliniat la stânga şi numărul la dreapta0x0010 dec conversie în zecimal0x0020 oct conversie în octal0x0040 hex conversie în hexazecimal0x0080 showbase se utilizează indicatorul bazei de numeraţie0x0100 showpoint Nr. real se afişează cu punct chiar dacă acestea are val. întreagă0x0200 uppercase se folosesc litere mari pt. sistemul hexa0x0400 showpos pentru val. numerice pozitive se afişează semnul '+'0x0800 scientific pentru nr. reale se foloseşte notaţia ştiinţifică0x1000 fixed pentru date reale se afişează în forma normală(-343.5656)

următorii manipulatori pot fi folosiţi şi fără mască:Manipulator Efect

oct conversie în octaldec conversie în zecimalhex 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 afişa:

Numarul n in baza 16 este: 0XANumarul n in baza 8 este: 012Numarul m scris cu E este: 9.7E+00

Toate informaţiile oferite mai sus sunt valabile şi pentru fişiere.

7