Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

C


Index » educatie » » informatica » C
CITIREA SI SCRIEREA DATELOR


CITIREA SI SCRIEREA DATELOR


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:

  • cin - face parte din clasa istream ce defineste un stream de intrare
  • cout - face parte din clasa ostream ce defineste un stream de iesire

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):

  • Citire : se citeste primul caracter care nu este alb
  • Scriere: se tipareste caracterul de pe pozitia curenta

Ex: include<iostream.h>

void main(void)

EROARE cin>>a<<b;

Variabile numerice (citire/scriere):

  • Citire : se face incepand cu pozitia curenta; se sare peste caracterele albe; citirea se face pana cand este intalnit un caracter ce nu poate face parte din acel tip de data
  • Scriere: se face incepand cu pozitia curenta curenta

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):

  • Citire : Se face incepand cu pozitia curenta; se sare peste caracterele albe; citirea se face pana cand este intalnit un caracter alb

Sirului astfel obtinut i se adauga caracterul nul, dupa care este memorat.

  • Scriere: se face incepand cu pozitia curenta pana este intalnit caracterul nul.

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 © 2023 - Toate drepturile rezervate