Sunteți pe pagina 1din 6

Valeriu Iorga Programare în C / C++

Operaţii de intrare / ieşire în C .


1. Fişiere standard (fluxuri de intrare/ieşire).
În C nu sunt definite operaţiile de intrare / ieşire şi nici noţiunea de fişier. Există o bibliotecă de
funcţii stdio.h care defineşte un tip fişier şi operaţii pe intrarea şi ieşirea standard. Includerea acestei
biblioteci în program se face cu directiva:
#include <stdio.h>
Există următoarele fişiere standard: fişierul standard de intrare (tastatura) stdin şi fişierul standard
de ieşire (ecranul) stdout, fişierul standard de eroare stderr.
Fişierele standard de intrare şi de ieşire sunt fişiere text şi constau din fluxuri de caractere.
Un flux text este o secvenţă de caractere impărţită în linii, fiecare linie fiind formată din 0 sau mai
multe caractere şi terminată prin caracterul linie nouă. Biblioteca standard asigură funcţii de citire şi scriere
a unui caracter (getchar() şi putchar()).
2. Scrierea cu format.
În limbajul C putem depune în fluxul de ieşire valorile unor expresii aparţinând unor tipuri
primitive şi anume caractere, întregi, reali şi şiruri de caractere. Funcţia 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 %. Afişarea fiecărei expresii se
face corespunzător 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 fără semn în baza 8
u - întreg fără 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 afişat sub forma [-]x.yyyyyye+zz
g - realizează conversia şi afişarea ca descriptorul f sau e astfel încât să apară un număr minim de cifre
afişate
Semnul - după % indică o aliniere la stânga în câmpul de lungime Lung (implicit alinierea se face
la dreapta).
Dacă expresia conţine mai puţin de Lung caractere, ea este precedată de spaţii sau zerouri, dacă
Lung începe printr-un zero.
Dacă expresia conţine mai mult de Lung caractere, câmpul de afişare este extins.În absenţa lui
Lung, expresia va fi afişată cu atâtea caractere câte le conţine.
frac - indică numărul de cifre după virgulă (precizia) cu care se face afişarea
l - marchează un long int (h - un short int). Pentru reali aceştia sunt double.
L - precede unul din descriptorii f,e,E,g,G pentru afişarea unei valori de tip long double
Funcţia furnizează numărul de caractere afişate. 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

1
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)
Citeşte 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 obţine 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 câmpului din care se face citirea. În lipsa lui citirea se opreşte la primul
caracter care nu face parte din număr.
L indică un întreg long sau un real double; h - indică un întreg short.
Funcţia scanf() furnizează numărul de câmpuri citite.
4. Citirea / scrierea la nivel de caracter.
Pentru realizarea operaţiilor de transfer între memorie şi fişierele standard se utilizează următoarele funcţii:
 getch() - citeşte un caracter, fără ecou de la tastatură; funcţia returnează valoarea ASCII a
caracterului citit.
Apelul getch(); se foloseşte pentru a reţine fereastra de ieşire; dacă se introduce un caracter, se
trece în fereastra de editare.
 getche() - are acelaşi efect cu funcţia getch(), cu deosebirea că citirea face cu ecou.
 putch(expresie) - afişează pe ecran caracterul având codul ASCII egal cu valoarea expresiei;
funcţia returnează codul caracterului afişat.
Aceste funcţii au prototipurile declarate în fişierul <conio.h>. pentru a le folosi va trebui să
includem acest fişier în programul nostru folosind directiva include.
 getchar() - nu este o funcţie ci o macroinstrucţiune. Are ca efect citirea cu ecou a unui caracter de
la terminalul standard. Caracterele introduse de la tastatură sunt puse într-o zonă tampon, până la
acţionarea tastei ENTER, moment în care în zona tampon se introduce caracterul rând nou.Fiecare apel
getchar() preia următorul caracter din zona tampon.
 putchar(expresie) - este tot o macroinstrucţiune, care afişează caracterul având codul ASCII
egal cu valoarea expresiei parametru.
Macrourile getchar şi putchar sunt definite în fişierul <stdio.h>.
5. Citirea / scrierea unei linii.
 gets(zona) - introduce de la terminalul standard un şir de caractere terminat prin acţionarea tastei
ENTER. Funcţia are ca parametru adresa zonei de memorie în care se introduc caracterele citite.
Funcţia returnează adresa de început a zonei de memorie (parametrul); la întâlnirea sfârşitului de fişier
(CTRL Z) funcţia returnează NUL.

2
Valeriu Iorga Programare în C / C++

 puts(zona) – afişează la terminalul standard şirul de caractere din zona dată ca parametru, până la
caracterul NUL,care va fi înlocuit prin caracterul linie noua. Funcţia returnează codul ultimului caracter
din şirul de caractere afisate (-1 în caz de eroare).
Funcţiile gets() şi puts() au prototipurile în fişierul <stdio.h>.

Operaţii de intrare / ieşire în C++ .


Ca şi în C, în C++ facilităţile de intrare / ieşire sunt implementate prin intermediul unei
biblioteci de funcţii.
Pe nivelul cel mai de jos, un fişier este interpretat ca un flux de octeţi (stream).
Pe nivelul utilizator, fişierul constă dintr-o secvenţă de tipuri amestecate de date: caractere, valori
aritmetice, obiecte.
Biblioteca de funcţii de intrare / ieşire realizează interfaţa între cele două niveluri.
În bibliotecă este predefinit un set de operaţii pentru citirea şi scrierea unor tipuri predefinite.
Aceste operaţii pot fi extinse de către programator pentru tipurile de date definite de către
utilizator (clase).
Operaţiile de intrare sunt suportate de clasa istream, cele de ieşire – de clasa ostream.
Scrierea în fluxul de ieşire (inserţie) se realizează cu operatorul << ( << x – preia date din x).
Citirea din fluxul de intrare (extracţie) 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 ieşirea standard, cerr – obiect din clasa ostream legat de
ieşirea standard de eroare nebuferată şi clog – legat de ieşirea standard de eroare buferată.
Intrările / ieşirile standard folosesc obiectele cin, cout şi cerr, iniţializate prin includerea
fişierului antet iostream.h.
1. Ieşirea 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 supraîncărcat pentru
tipurile utilizator (tipuri abstracte). Exemple:
#include <iostream.h>
int n=10;
cout << n << “\n”; // acelasi efect are printf(“%d\n”, n);
char c=’A’;
cout << c << “\n”; // similar cu printf(“%c\n”, c);
Pentru realizarea unor facilităţi de formatare, în C++ seutilizează indicatori de format (flaguri),
care conţin într-o dată membru al clasei ios biţii cu semnificaţiile următoare:
enum {
skipws =0x0001, // salt peste spatii albe
left =0x0002, // alinierea iesirii la stinga
right =0x0004, // alinierea iesirii la dreapta
internal =0x0008,
dec =0x0010, // conversie in zecimal
oct =0x0020, // conversie in octal
hex =0x0040, // conversie in hexazecimal,
showbase =0x0080, // se afiseaza baza
showpoint =0x0100, // se afiseaza punctul zecimal
uppercase =0x0200, // se afiseaza cu litere mari
showpos =0x0400, // intregii pozitivi sunt afisati cu +
scientific=0x0800, // realii se afiseaza cu exponent
fixed =0x1000, // realii se afiseaza fara exponent
unitbuf =0x2000, // se goleste zona tampon pentru iesiri
stdio =0x4000, // dupa fiecare iesire se videaza stdout
};

3
Valeriu Iorga Programare în C / C++

În absenţa indicaţiilor de formatare, se face o formatare implicită, în baza 10, cu aliniere la dreapta
în câmpul de ieşire.
Pentru a realiza o formatare definită de utilizator, diferită de cea implicită, se pot seta biţii
membrului indicator cu funcţiile:
long setf(long f); // seteaza indicatorii, intoarce vechiul format
long setf(long b, long g);//seteaza bitul specificat din grupa
Biţii indicatorului de format se împart în 3 grupe:
1) aliniere (adjustfield) cu biţii right, left şi internal
2) bază (basefield) cu biţii dec, oct, hex
3) exponent (floatfield) cu biţii 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, lăţimea minimă a zonei de afişare este 0; ea poate fi extinsă automat pentru a permite
afişarea datei cu toate cifrele.
Dacă numărul de caractere al datei este mai mic decât lăţimea minimă a zonei de afişare, se face
aliniere la dreapta, completată la stânga cu spaţii libere.
Caracterul de umplere (cu care se completează lăţimea minimă a zonei de afişare poate fi definit
prin:
char fill(); // intoarce codul caracterului de umplere curent
char fill(char c); //defineste un nou caracter de umplere
Numărul de zecimale cu care se afişează un număr 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 operaţiile de intrare / ieşire, într-un mod mai simplu decât o fac
indicatorii de format.
Există următorii manipulatori:
dec – indicator de conversie zecimal
oct – indicator de conversie octal
hex – indicator de conversie hexazecimal
ws – setare salt peste spaţii albe
endl – inserează linie nouă şi goleşte tamponul fluxului
ends – inserează caracterul nul de terminare a unui şir de caractere
flush – goleşte tamponul fluxului
setbase(int n) - setează baza(n = 0, 8, 10, 16)

4
Valeriu Iorga Programare în C / C++

resetiosflags(long x) – şterge biţii de format specificaţi


setiosflags(long x) – setează biţii de format specificaţi
setfill(int n) – setează caracterul de umplere
setprecision(int n) – setează precizia
setw(int w) – setarea lăţimii câmpului de afişare
Pentru a folosi manipulatori se include fişierul 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 foloseşte operatorul de extragere >>.
Acesta este predefinit pentru tipurile primitive: caracter, întregi, reali, şiruri de caractere.. Operatorul poate
fi supraîncărcat pentru tipuri utilizator..
În mod implicit, operatorul >> sare spaţiile albe până la primul caracter care nu este spaţiu alb.
int n;
cin >> n; //echivalent cu scanf(“%d”, &n);
La citirea într-un tablou şir de caractere, trebuie să ne asigurăm că nu se citesc mai multe caractere
decât are rezervat tabloul:
char x[100];
cin.width(sizeof x);
cin >> x;
Transferul începe cu primul caracter nealb şi se încheie la întâlnirea primului caracter alb sau a
unui caracter ce nu aparţine tipului.
În operaţiile de extragere nu pot fi utilizaţi manipulatorii: endl, ends, flush, setbase.
Manipulatorul ws se foloseşte numai în operaţiile de extragere.
Un flux are asociată o stare de eroare – membrul dată state al clasei ios.
enum io_state {
goodbit=0x00, // operatie de I/E corecta
eofbit =0x01, // s-a intilnit eof la citire
failbit=0x02, // ultima operatie de I/E esuata
badbit =0x04, // ultima operatie de I/E incorecta
hardfail=0x08 // eroare irecuperabila
};
Dacă fluxul intră în stare de eroare, operaţiile de intrare / ieşire pot fi continuate numai după ce
condiţia de eroare a fost înlăturată şi biţii de eroare au fost şterşi. Acest lucru nu este posibil dacă se
produce o eroare irecuperabilă.
Accesul la biţii de eroare se face folosind funcţiile:
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:

5
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. Operaţii de intrare / ieşire fără format.


4.1. Scrierea unui caracter.
char c;
cout.put( c ); // similar cu cout << c
4.2. Scrierea a n octeţi.
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 intrării la ieşire 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 până la întâlnirea terminatorului). Ultimul
caracter pus este 0 (terminatorul de şir).
4.5. Citirea fără format a n octeţi.
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ă aplicaţie o reprezintă recunoaşterea identificatorilor – primul caracter care nu mai
aparţine identificatorului trebuie pus înapoi.
peek(); - întoarce următorul caracter, dar nu-l extrage din flux
ignore(int n=1, int delim=EOF); - ignoră n caractere; se opreşte la întâlnirea caracterului
delim.

S-ar putea să vă placă și