You are on page 1of 6

Valeriu Iorga

Programare n C / C++
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

Valeriu Iorga

Programare n C / C++
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.

Valeriu Iorga

Programare n C / C++

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

Valeriu Iorga

Programare n C / C++

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)

Valeriu Iorga

Programare n C / C++

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:

Valeriu Iorga

Programare n C / C++

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.

You might also like