Sunteți pe pagina 1din 6

Operaii de intrare / ieire n C . 1. Fiiere standard (fluxuri de intrare/ieire). n C nu sunt definite operaiile de intrare / ieire i nici noiunea de fiier.

Exist o bibliotec de funcii stdio.h care definete un tip fiier i operaii pe intrarea i ieirea standard. Includerea acestei biblioteci n program se face cu directiva: #include <stdio.h> Exist urmtoarele fiiere standard: fiierul standard de intrare (tastatura) stdin i fiierul standard de ieire (ecranul) stdout, fiierul standard de eroare stderr. Fiierele standard de intrare i de ieire sunt fiiere text i constau din fluxuri de caractere. Un flux text este o secven de caractere imprit n linii, fiecare linie fiind format din 0 sau mai multe caractere i terminat prin caracterul linie nou. Biblioteca standard asigur funcii de citire i scriere a unui caracter (getchar() i putchar()). 2. Scrierea cu format. n limbajul C putem depune n fluxul de ieire valorile unor expresii aparinnd unor tipuri primitive i anume caractere, ntregi, reali i iruri de caractere. Funcia printf() realizeaz transferul i conversia de reprezentare a valorii ntregi / reale n ir de caractere sub controlul unui format (specificat ca un ir de caractere): printf( format, e1, e2, , en) Pentru fiecare ei exist n format un descriptor care ncepe prin %. Afiarea fiecrei expresii se face corespunztor descriptorului. Sintaxa descriptorului este: % [ - ] [ Lung ] [ .frac ] [ l ] descriptor Descriptorul indic ce conversie (n ir de caractere) se face: d - ntreg cu semn n baza 10 o - ntreg fr semn n baza 8 u - ntreg fr semn n baza 10 x sau X - ntreg cu semn n baza 16, cu cifrele A-F mici sau mari c - caracter s - ir de caractere f - real zecimal de forma [-]xxx.yyyyyy (implicit 6 cifre) e sau E - real afiat sub forma [-]x.yyyyyye+zz g - realizeaz conversia i afiarea ca descriptorul f sau e astfel nct s apar un numr minim de cifre afiate Semnul - dup % indic o aliniere la stnga n cmpul de lungime Lung (implicit alinierea se face la dreapta). Dac expresia conine mai puin de Lung caractere, ea este precedat de spaii sau zerouri, dac Lung ncepe printr-un zero. Dac expresia conine mai mult de Lung caractere, cmpul de afiare este extins.n absena lui Lung, expresia va fi afiat cu attea caractere cte le conine. frac - indic numrul de cifre dup virgul (precizia) cu care se face afiarea l - marcheaz un long int (h - un short int). Pentru reali acetia sunt double. L - precede unul din descriptorii f,e,E,g,G pentru afiarea unei valori de tip long double Funcia furnizeaz numrul de caractere afiate. Exemple: printf(%10d\n, x); /* afisare valoare n 10 pozitii, aliniata la dreapta si completata cu blancuri */ printf(%-10d\n,x); /* afisare valoare in 10 pozitii, aliniata la stanga si completata cu blancuri */ printf(%#010d\n,x);/*afisare valoare in 10 pozitii, aliniata la

dreapta si completata cu zerouri */ printf(%#x10d\n,x);/* afisare valoare in 10 pozitii, aliniata la dreapta si completata cu 0x */ 3. Citirea cu format. scanf( format, a1, a2, , an) Citete valorile de la intrarea standard n formatul precizat i le plaseaz n variabilele cu adresele a1, a2,. Pentru o variabil simpl sau nregistrare, adresa se obine folosind operatorul @. Sintaxa descriptorului de format este: % [*] [ Lung ] [ l ] descriptor Descriptorul indic conversia care se face: d - ntreg n baza 10 o - ntreg n baza 8 x - ntreg n baza 16 f - real c - caracter s - ir de caractere. * indic faptul c valoarea citit nu se atribuie unei variabile. Lung indic lungimea cmpului din care se face citirea. n lipsa lui citirea se oprete la primul caracter care nu face parte din numr. L indic un ntreg long sau un real double; h - indic un ntreg short. Funcia scanf() furnizeaz numrul de cmpuri citite. 4. Citirea / scrierea la nivel de caracter. Pentru realizarea operaiilor de transfer ntre memorie i fiierele standard se utilizeaz urmtoarele funcii: getch() - citete un caracter, fr ecou de la tastatur; funcia returneaz valoarea ASCII a caracterului citit. Apelul getch(); se folosete pentru a reine fereastra de ieire; dac se introduce un caracter, se trece n fereastra de editare. getche() - are acelai efect cu funcia getch(), cu deosebirea c citirea face cu ecou.

putch(expresie) - afieaz pe ecran caracterul avnd codul ASCII egal cu valoarea expresiei; funcia returneaz codul caracterului afiat. Aceste funcii au prototipurile declarate n fiierul <conio.h>. pentru a le folosi va trebui s includem acest fiier n programul nostru folosind directiva include.

getchar() - nu este o funcie ci o macroinstruciune. Are ca efect citirea cu ecou a unui caracter de la terminalul standard. Caracterele introduse de la tastatur sunt puse ntr-o zon tampon, pn la acionarea tastei ENTER, moment n care n zona tampon se introduce caracterul rnd nou.Fiecare apel getchar() preia urmtorul caracter din zona tampon. putchar(expresie) - este tot o macroinstruciune, care afieaz caracterul avnd codul ASCII egal cu valoarea expresiei parametru. Macrourile getchar i putchar sunt definite n fiierul <stdio.h>. 5. Citirea / scrierea unei linii.

gets(zona) - introduce de la terminalul standard un ir de caractere terminat prin acionarea tastei ENTER. Funcia are ca parametru adresa zonei de memorie n care se introduc caracterele citite. Funcia returneaz adresa de nceput a zonei de memorie (parametrul); la ntlnirea sfritului de fiier (CTRL Z) funcia returneaz NUL.

puts(zona) afieaz la terminalul standard irul de caractere din zona dat ca parametru, pn la caracterul NUL,care va fi nlocuit prin caracterul linie noua. Funcia returneaz codul ultimului caracter din irul de caractere afisate (-1 n caz de eroare). Funciile gets() i puts() au prototipurile n fiierul <stdio.h>. Operaii de intrare / ieire n C++ .

Ca i n C, n C++ facilitile de intrare / ieire sunt implementate prin intermediul unei biblioteci de funcii. Pe nivelul cel mai de jos, un fiier este interpretat ca un flux de octei (stream). Pe nivelul utilizator, fiierul const dintr-o secven de tipuri amestecate de date: caractere, valori aritmetice, obiecte. Biblioteca de funcii de intrare / ieire realizeaz interfaa ntre cele dou niveluri. n bibliotec este predefinit un set de operaii pentru citirea i scrierea unor tipuri predefinite. Aceste operaii pot fi extinse de ctre programator pentru tipurile de date definite de ctre utilizator (clase). Operaiile de intrare sunt suportate de clasa istream, cele de ieire de clasa ostream. Scrierea n fluxul de ieire (inserie) se realizeaz cu operatorul << ( << x preia date din x). Citirea din fluxul de intrare (extracie) se realizeaz cu operatorul >> ( >>x pune date in x). Sunt predefinite 4 fluxuri de date: cin obiect din clasa istream, legat de intrarea standard, cout obiect din clasa ostream, legat de ieirea standard, cerr obiect din clasa ostream legat de ieirea standard de eroare nebuferat i clog legat de ieirea standard de eroare buferat. Intrrile / ieirile standard folosesc obiectele cin, cout i cerr, iniializate prin includerea fiierului antet iostream.h. 1. Ieirea standard. Se realizeaz folosind operatorul de inserare << (depune n flux). Acest operator este predefinit pentru tipurile: caracter, ntregi, reali, iruri de caractere, pointeri. Operatorul poate fi suprancrcat pentru tipurile utilizator (tipuri abstracte). Exemple: #include <iostream.h> int n=10; cout << n << \n; char c=A; cout << c << \n;

// acelasi efect are printf(%d\n, n); // similar cu printf(%c\n, c);

Pentru realizarea unor faciliti de formatare, n C++ seutilizeaz indicatori de format (flaguri), care conin ntr-o dat membru al clasei ios biii cu semnificaiile urmtoare: enum { skipws =0x0001, left =0x0002, right =0x0004, internal =0x0008, dec =0x0010, oct =0x0020, hex =0x0040, showbase =0x0080, showpoint =0x0100, uppercase =0x0200, showpos =0x0400, scientific=0x0800, fixed =0x1000, unitbuf =0x2000, stdio =0x4000, // salt peste spatii albe // alinierea iesirii la stinga // alinierea iesirii la dreapta // // // // // // // // // // // conversie in zecimal conversie in octal conversie in hexazecimal, se afiseaza baza se afiseaza punctul zecimal se afiseaza cu litere mari intregii pozitivi sunt afisati cu + realii se afiseaza cu exponent realii se afiseaza fara exponent se goleste zona tampon pentru iesiri dupa fiecare iesire se videaza stdout

};

n absena indicaiilor de formatare, se face o formatare implicit, n baza 10, cu aliniere la dreapta n cmpul de ieire. Pentru a realiza o formatare definit de utilizator, diferit de cea implicit, se pot seta biii membrului indicator cu funciile: long setf(long f); // seteaza indicatorii, intoarce vechiul format long setf(long b, long g);//seteaza bitul specificat din grupa Biii indicatorului de format se mpart n 3 grupe:

1) aliniere (adjustfield) cu biii right, left i internal 2) baz (basefield) cu biii dec, oct, hex 3) exponent (floatfield) cu biii scientific i fixed.
ntr-o grup poate fi setat un singur indicator. int width(); // returneaza latimea zonei de afisare int width(int w); // modifica la w, latimea zonei de afisare Implicit, limea minim a zonei de afiare este 0; ea poate fi extins automat pentru a permite afiarea datei cu toate cifrele. Dac numrul de caractere al datei este mai mic dect limea minim a zonei de afiare, se face aliniere la dreapta, completat la stnga cu spaii libere. Caracterul de umplere (cu care se completeaz limea minim a zonei de afiare poate fi definit prin: char fill(); // intoarce codul caracterului de umplere curent char fill(char c); //defineste un nou caracter de umplere Numrul de zecimale cu care se afieaz un numr real (precizia) poate fi setat cu: int precision(); //intoarce precizia curenta int precision(int n); // modifica precizia la n cifre, // intoarce vechea precizie Exemple: int i=25; cout.width(10); cout.setf(ios::left,ios::adjustfield); cout.fill(0); cout.setf(ios::showpos); cout.setf(ios::hex,ios::basefield); cout << i << endl; double x=123.456; cout.setf(ios::scientific,, ios::floatfield); cout.precision(5); cout << x << endl; 2. Manipulatori. Permit definirea formatelor pentru operaiile de intrare / ieire, ntr-un mod mai simplu dect o fac indicatorii de format. Exist urmtorii manipulatori: dec indicator de conversie zecimal oct indicator de conversie octal hex indicator de conversie hexazecimal ws setare salt peste spaii albe endl insereaz linie nou i golete tamponul fluxului ends insereaz caracterul nul de terminare a unui ir de caractere flush golete tamponul fluxului

setbase(int n) - seteaz baza(n = 0, 8, 10, 16) resetiosflags(long x) terge biii de format specificai setiosflags(long x) seteaz biii de format specificai setfill(int n) seteaz caracterul de umplere setprecision(int n) seteaz precizia setw(int w) setarea limii cmpului de afiare Pentru a folosi manipulatori se include fiierul iomanip.h Exemple: int i = 12345; cout << setw(10) << resetiosflags(ios::internal|ios::left) << setiosflags(ios::right) << setfill(0) << setiosflags(ios::showpos) << i; double x = 2.718281; cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific) << setprecision(10) << x; 3. Intrarea standard. Pentru a realiza citiri din fluxul de intrare standard cin se folosete operatorul de extragere >>. Acesta este predefinit pentru tipurile primitive: caracter, ntregi, reali, iruri de caractere.. Operatorul poate fi suprancrcat pentru tipuri utilizator.. n mod implicit, operatorul >> sare spaiile albe pn la primul caracter care nu este spaiu alb. int n; cin >> n; //echivalent cu scanf(%d, &n);

La citirea ntr-un tablou ir de caractere, trebuie s ne asigurm c nu se citesc mai multe caractere dect are rezervat tabloul: char x[100]; cin.width(sizeof x); cin >> x; Transferul ncepe cu primul caracter nealb i se ncheie la ntlnirea primului caracter alb sau a unui caracter ce nu aparine tipului. n operaiile de extragere nu pot fi utilizai manipulatorii: endl, ends, flush, setbase. Manipulatorul ws se folosete numai n operaiile de extragere. Un flux are asociat o stare de eroare membrul dat state al clasei ios. enum io_state { goodbit=0x00, eofbit =0x01, failbit=0x02, badbit =0x04, hardfail=0x08 }; // // // // // operatie de I/E corecta s-a intilnit eof la citire ultima operatie de I/E esuata ultima operatie de I/E incorecta eroare irecuperabila

Dac fluxul intr n stare de eroare, operaiile de intrare / ieire pot fi continuate numai dup ce condiia de eroare a fost nlturat i biii de eroare au fost teri. Acest lucru nu este posibil dac se produce o eroare irecuperabil. Accesul la biii de eroare se face folosind funciile: int good(); int eof(); int fail(); // intoarce 1 daca failbit | hardfail int bad(); int rdstate(); void clear(int i=0); clear(); // anuleaza bitii de eroare mai putin hardfail

Un stream poate fi testat pentru a vedea dac se afl n stare de eroare: if(!cin) // cin==0 daca un bit de eroare este setat if(cin>>x) //rezultatul este convertit intr-un pointer, care //este 0 daca un bit de eroare este setat 4. Operaii de intrare / ieire fr format. 4.1. Scrierea unui caracter. char c; cout.put( c ); // similar cu cout << c 4.2. Scrierea a n octei. ostream& ostream::write(char*,int); //pune n octeti din sirul s in cout int n; char s[100]; cout.write(s, n); //insereaza n octeti din s in cout 4.3. Citirea unui caracter. istream& get(char&); // extrage 1 caracter din fluxul curent char c; cin.get( c ); //citeste 1 caracter,inclusiv spatiu alb Copierea intrrii la ieire se face prin: while( (c=cin.get())!=EOF) cout.put( c ); echivalent cu: while(cin.get(c)) cout.put(c); 4.4. Citirea unei linii. istream& getline(char* zona, int max, int term=\n); const int MAX=80; char linie[MAX]; cin.getline(linie, MAX); Sunt extrase n zona, cel mult max-1 caractere (sau pn la ntlnirea terminatorului). Ultimul caracter pus este 0 (terminatorul de ir). 4.5. Citirea fr format a n octei. istream& read(char* zona, int n);//extrage n octeti in zona 4.6. Punerea unui caracter n fluxul de intrare. istream& putback(char); cin.putback(c); // pune c in streamul cin

O posibil aplicaie o reprezint recunoaterea identificatorilor primul caracter care nu mai aparine identificatorului trebuie pus napoi. peek(); - ntoarce urmtorul caracter, dar nu-l extrage din flux ignore(int n=1, int delim=EOF); - ignor n caractere; se oprete la ntlnirea caracterului delim.