Professional Documents
Culture Documents
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 */
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++ .
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,
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++
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
};
//
//
//
//
//
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++