Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
CITIREA SI SCRIEREA DATELOR
STREAM- uri
Datele pot avea urmatoarele trasee:
sursa: tastatura → dest: monitor
sursa: tastatura → dest: fisier
sursa: fisier → dest: monitor
sursa: fisier → dest: fisier
Def: Acest flux de date de la o sursa catre o destinatie poarta numele de stream.
De ce este importanta notiunea de stream ? Deoarece observam ca indiferent de tipul sursei sau al destinatiei schimbul se realizeaza.
1.Elementele ce caracterizeaza strem-ul
Sensul deplasarii datelor - stream-uri de intrare (citire)
sursa: oarecare (nu variabila) → dest: variabila
- stream-uri de iesire (scriere)
sursa: variabila → dest: oarecare (nu variabila)
- stream-uri de intrare/iesire (citire/scriere)
sursa: variabila → dest: variabila
Natura sursei (destinatiei)
Stream-uri de intrare:
istrem-uri sursa: tastatura
ifstream-uri sursa: fisier oarecare
Stream-uri de iesire:
ostrem-uri dest: monitorul
ofstream-uri dest: fisier oarecare
Un stream este un obiect - utilizarea impune folosirea fisierului <iostream.h> (ca si <ios.h>)
Un stream poate efectua orice tip de conversie permisa in C++ . Conversiile se fac:
implicit (nu mai trebuie specificat tipul datei) sau
explicit (prin utilizarea metodelor specifice)
In continuare vom studia pentru inceput stream-urile de intrare si iesire standard istream si ostream. ATENTIE tot ce invatam la ele este valabil si pentru fisiere. De ce? datorita mostenirii.
2.Strem-uri de intrare si de iesire standard
Fisierul <iostream.h> contine definitia urmatoarelor obiecte:
OBS: Citirile si scrierile se pot face folosind obiectele cin si cout.
2.1.Citiri si scrieri fara format
In C pentru scrieri si citiri se folosesc functiile printf si scanf cu care nu se pot scrie/citi date fara a utiliza formate. Nu este cazul de fata, obiectele cin si cout vor permite acest lucru.
Pentru citire se va folosi operatorul '>>' si pentru scriere se va folosi op. '<<'. In cazul scrierii constructia endl face posibila trecerea la o linie noua.
Variabile de tip char (citire/scriere):
Ex: include<iostream.h>
void main(void)
EROARE cin>>a<<b;
Variabile numerice (citire/scriere):
Ex: include<iostream.h> void main(void) |
daca se tasteaza 12 se tip 12 daca se tasteaza ' 17ab' se tip 17 daca se tasteaza 123.78 se tip 123 |
Ex: include<iostream.h> void main(void) |
daca se tasteaza ' 12 54.89' se tip 12 54.89 daca se tasteaza 123.45 se tipareste 123 0.45 |
Siruri de caractere (citire/scriere):
Sirului astfel obtinut i se adauga caracterul nul, dupa care este memorat.
Ex: include<iostream.h> void main(void) |
daca se tasteaza acesta este un text se va afisa acesta |
In continuare vom vedea cum tratam erorile generate de aceste obiecte.
2.2.Tratarea erorilor
Presupunem ca dorim sa citim o variabila de tip int. Din greseala sau intentionat introducem un sir care incepe cu o litera, in acest caz citirea esueaza:
#include<iostream.h> void main(void) |
Daca se introduce x89 se va afisa 2t3. De ce? var a nu a putut fi citita('x' nu este numar) si atunci valoarea ei anterioara ramane aceeasi (adica a = 2 toate citirile sunt blocate din aceasta cauza, deci b si c raman nemodificate |
Clasa ios defineste 5 constante, astfel:
enum io_state ;
Variabila state din clasa ios retine modul in care s-a efectuat ultima operatia de intrare/iesire, astfel:
Daca 'operatia s-a efectuat corect' atunci state = 0 altfel state = valoarea corespunzatoare const. de mai sus |
Continutul variabilei state poate fi obtinut cu ajutorul metodei rdstate() a clasei ios
int rdstate()
Ex:
#include<iostream.h> void main(void) |
daca se introduce 1 se tipareste (citire corecta) daca se introduce 's' se tipareste (eroare reparabila) daca se introduce ^Z se tipareste (sf de fisier + eroare reparabila) |
Ex: 2) Se introduc numere pana la apasarea caracterului ^Z, se cere sa se afiseze numerele pare introduse
#include<iostream.h>
#include<conio.h>
void main(void)
Conditia din while contine doua expresii: prima citeste o valoare in a, iar cea de-a doua verifica daca citirea a fost corecta. Cat timp citirea este corecta se executa instructiunea de verificare daca acel numar este par sau nu.
Am vazut ca prin cin>>a>>b>>c; variabilele b si c pot fi initializate prin citire numai daca citirea variabilei a este corecta. Clasa ios mai contine metoda:
void clear ( int = 0 )
ce permite setarea variabilei state cu o valoare. Daca parametrul lipseste aceasta valoare este 0.
Ex:
#include<iostream.h> void main(void) |
Daca se introduce x9 se tipareste 2x9 deoarece variabila a nu a fost citita (ea va avea valoarea cu care a fost initializata, adica 2), dar b si c au fost citite. |
Ex: 2) Analizati programul urmator:
#include<iostream.h> void main(void) |
Expresia cin>>a,cin.rdstate() se evalueaza de la stanga la dreapta, deci se incearca citirea variabilei a, daca tentativa reuseste atunci STOP (cin.rdstate() == 0), altfel variabila state = 0 si caracterul de pe pozitia curenta este atribuit variabilei c. Procedeul se repeta pana cand in a va fi citit primul numar introdus. Daca se introduce abc34sr56 o variabila a = 34 |
Clasa ios mai contine urmatoarele metode utile in tratarea erorilor:
int fail() - daca operatia de intrare/iesire a esuat
atunci returneaza val. 0
altfel returneaza val = 0
int good() - daca operatia de intrare/iesire a reusit
atunci returneaza val. 0
altfel returneaza val = 0
#include<iostream.h>//aplicatia numara cate numere intregi s-au introdus
#include<conio.h>
void main(void)
2.1.Citiri si scrieri cu format <iomanip.h>
Este comod sa efectuam citiri si scrieri fara format dar aceasta modalitate uneori este insuficienta. In C++ este posibil sa efectuam citiri/scrieri cu format fara a utiliza functiile printf si scanf.
CITIRE: cin >>manipulator_1>>>>manipulator_n>>variabila
SCRIERE: cout <<manipulator_1<<<<manipulator_n<<variabila | constanta
unde variabila | constanta - nume_de_var sau nume_de_const sau o constanta
manipulatori - sunt functii de sistem ce pot fi apelate in stream-uri la citire/scriere (pentru aceasta trebuie apelat in program fisierul iomanip.h)
Manipulatori specifici operatiei de scriere:
Manipulator |
Tip x |
Acces la var de mem sistem: |
Scop |
setprecision(x) |
int |
x_precision |
Stabileste numarul de zecimale (x) pt. un nr. real |
setw(x) |
int |
x_width |
nr. de poz. pe care se face afisarea |
setfill(x) |
char |
x_fill |
stabileste care este car.de umplere folosit |
Ex:
#include<iostream.h>
#include<iomanip.h>
void main(void)
Se va afisa pe ecram: f0.12
Manipulatori:
Manipulator |
Acces la variabila de mem. sistem: |
Scop |
setioflags(masca) |
x_flags |
seteaza bitii precizati in masca (val. 1) |
resetioflags(masca) |
x_flags |
seteaza bitii precizati in masca (val. 0) |
unde masca ase formeaza astfel: ios::const_1 | | ios::const_n
unde cont_1const_n sunt constante simbolice cu anumite efecte asupra datelor, explicate in tabelul urmator:
Constanta |
Const. simbolica |
Semnificatie |
0x0001 |
skipws |
caracterele albe care preced valoarea sunt ignorate |
0x0002 |
left |
afisarea datelor se face cu aliniere la stanga |
0x0004 |
right |
afisarea datelor se face cu aliniere la dreapta |
0x0008 |
internal |
daca spatiul unde se va afisa numarul este mai mare atunci semnul va fi aliniat la stanga si numarul la dreapta |
0x0010 |
dec |
conversie in zecimal |
0x0020 |
oct |
conversie in octal |
0x0040 |
hex |
conversie in hexazecimal |
0x0080 |
showbase |
se utilizeaza indicatorul bazei de numeratie |
0x0100 |
showpoint |
Nr. real se afiseaza cu punct chiar daca acestea are val. intreaga |
0x0200 |
uppercase |
se folosesc litere mari pt. sistemul hexa |
0x0400 |
showpos |
pentru val. numerice pozitive se afiseaza semnul '+' |
0x0800 |
scientific |
pentru nr. reale se foloseste notatia stiintifica |
0x1000 |
fixed |
pentru date reale se afiseaza in forma normala(-343.5656) |
urmatorii manipulatori pot fi folositi si fara masca:
Manipulator |
Efect |
oct |
conversie in octal |
dec |
conversie in zecimal |
hex |
conversie in hexazecimal |
Ex:
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
void main(void)
Daca se introduc valorile n = 12 si m = 9.8 se va afisa:
Numarul n in baza 16 este: 0XA
Numarul n in baza 8 este: 012
Numarul m scris cu E este: 9.7E+00
Toate informatiile oferite mai sus sunt valabile si pentru fisiere.
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate