Documente Academic
Documente Profesional
Documente Cultură
-1-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
Tabelul urmtor conine o descriere detaliat a funciilor pentru operaiile I/O la nivel de caracter:
Tabelul urmtor conine o descriere detaliat a funciilor pentru operaiile I/O cu iruri de caractere:
Funcie Exemple Descriere Rezultat
utilizare
char * gets(char * s); char sir[10]; Citete caractere pn la Returneaz adresa
gets(sir); ntlnirea lui Enter; acesta primului caracter din ir.
nu se adaug la irul s. Dac se tasteaz CTRL+Z
Plaseaz /0 la sfritul lui s. returneaz NULL.
Obs: codul lui Enter e scos
din buffer-ul de intrare.
int puts(const char * char sir[10]; Tiprete irul primit ca Returneaz codul ultimului
s); puts(sir); parametru, apoi NewLine, caracter din ir sau EOF la
cursorul trecnd la insucces
nceputul rndului urmtor
Funciile scanf i printf permit citirea cu format i respectiv scrierea cu format pentru orice tip de
date. Antetul i descrierea acestor funcii sunt:
int printf ( format, arg1, arg2, ... );
afieaz pe ecran valorile expresiilor din lista argumentelor, conform formatului specificat;
argumentele pot fi constante, variabile, expresii
dac nu apare nici un argument, pe ecran se tipresc doar caracterele din irul format.
formatul este un ir de caractere care trebuie s includ cte un descriptor de format pentru
fiecare din argumente.
-2-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
caracterele din format care nu fac parte din descriptori se tipresc pe ecran.
%g, %G numere reale n format %f sau %e, funcie de valoare real, ca %e, %E
dac exp. < -4 sau precizia; altfel ca %f. Nu tiprete zerouri sau punct
zecimal n mod inutil
%p pointer, n formatul tiprit de printf
%ld, %li numere ntregi lungi
%lf, %le, %lg numere reale n precizie dubl (double)
%Lf, %Le, %Lg numere reale de tip long double
%% caracterul procent
-3-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
int a=3;
printf ("%d\n",a);
// afieaz 3 ca ntreg i trece la linia urmtoare
Programatorul trebuie s asigure concordana dintre descriptorii de format i tipul variabilelor sau
expresiilor argument, deoarece funciile scanf i printf nu fac nici o verificare i nu semnaleaz
neconcordane. Exemplele urmtoare trec de compilare (fr mesaj de eroare) dar afieaz incorect
valorile variabilelor:
int i=3;
float f=3.14;
printf ("%f \n", i); // scrie 0.00 (n Dev-Cpp)
printf ("%i \n", f); // scrie 1610612736 (Dev-Cpp)
Funciile scanf i printf folosesc noiunea de cmp (field): un cmp conine o valoare i este separat
de alte cmpuri prin spaii. Fiecare descriptor de format poate conine mrimea cmpului, ca numr
ntreg. Aceast mrime se folosete mai ales la afiare, pentru afiare numere pe coloane, aliniate la
dreapta. n lipsa acestei informaii mrimea cmpului rezult din valoarea afiat.
-4-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
Exemple:
printf("%d %d",a,b); // 2 campuri separate prin blanc(spatiu)
printf("%8d8%d",a,b); // 2 cmpuri alturate de cate 8 caractere
printf("number=%8d.\n", number);
// afieaz number= 123456. intr-un camp de 8 pozitii
printf("number=%3d.\n", number); /* dimensiunea campului este prea
mica;este ignorata.*/
// afieaz number=123456.
Dac nu se precizeaz mrimea cmpului i numrul de cifre de la partea fracionar pentru numere,
atunci funcia printf alege automat aceste valori:
dimensiunea cmpului rezult din numrul de caractere necesar pentru afiarea cifrelor,
semnului i altor caractere cerute de format;
numrul de cifre de la partea fracionar este 6 indiferent dac numerele sunt de tip float sau
double sau long double, dac nu este precizat explicit.
Se poate preciza numai mrimea cmpului sau numai numrul de cifre la partea fracionar.
Exemple:
float a=1.; double b=0.0002; long double c=7.5; float d=-12.34;
printf ("%.0f %20lf %20.10Lf %f \n", a, b, c, d);
Specificnd dimensiunea cmpului n care se afieaz o valoare, putem realiza scrierea mai multor
valori n coloane. Dac valoarea de afiat necesit mai puine caractere dect este mrimea
cmpului, atunci aceast valoare este aliniat la dreapta n cmpul respectiv.
Secvena urmtoare va scrie trei linii, iar numerele afiate vor apare ntr-o coloan cu cifrele de
aceeai pondere aliniate unele sub altele:
Formatul cu exponent (%e) este util pentru numere foarte mari, foarte mici sau despre ale cror
valori nu se tie nimic. Numrul este scris cu o mantis fracionar (ntre 0 i 10) i un exponent al
lui 10, dup litera E (e).
-5-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
ntre caracterul % i literele care desemneaz tipul valorilor scrise mai pot apare, n ordine:
a) un caracter ce exprim anumite opiuni de scriere:
- (minus): aliniere la stnga n cmpul de lungime specificat
+ (plus): se afieaz i semnul + pentru numere pozitive
0 : numerele se completeaz la stnga cu zerouri pe lungimea w
# : form alternativ de scriere pentru numere
b)
un numr ntreg w ce arat lungimea cmpului pe care se scrie o valoare, sau
caracterul * dac lungimea cmpului se d ntr-o variabil de tip int care precede
variabila a crei valoare se scrie.
c) punct urmat de un ntreg, care arat precizia (numrul de cifre de dup punctul zecimal)
cu care se scriu numerele nentregi.
d) una din literele h, l sau L care modific lungimea tipului numeric.
n general trebuie s existe o concordan ntre numrul i tipul variabilelor i formatul de citire sau
scriere din funciile scanf i printf, dar aceast concordan nu poate fi verificat de compilator i
nici nu este semnalat ca eroare la execuie, dar se manifest prin falsificarea valorilor citite sau
scrise. O excepie notabil de la aceast regul general este posibilitatea de a citi sau scrie corect
numere de tip double cu formatul %f (pentru tipul float), dar nu i numere de tip long double (din
cauza diferenelor de reprezentare intern a exponentului).
-6-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
Dup cum spuneam mai sus, argumentele funciei scanf sunt de tip pointer i conin adresele unde
se memoreaz valorile citite. Pentru variabile numerice aceste adrese se obin cu operatorul de
adresare (&) aplicat variabilei care primete valoarea citit.
Numerele citite cu scanf pot fi introduse pe linii separate sau n aceeai linie dar separate prin spaii
sau caractere Tab. ntre numere succesive pot fi oricte caractere separator (\n,\t, ). Un numr
se termin la primul caracter care nu poate apare ntr-un numr.
Exemple:
int n, a,b;
scanf("%d", &n); // citete un ntreg n variabila n
scanf("%d%d", &a,&b); // citete doi ntregi in a i b
float rad;
scanf("%f", &rad); // citete un numar real in rad
char c;
scanf("%c", &c); // citete un caracter in c
int main() {
int anInt;
float aFloat;
double aDouble;
return 0;
}
-7-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
La citirea de iruri trebuie folosit un vector de caractere, iar n funcia scanf se folosete numele
vectorului (echivalent cu un pointer). Exemplu:
char s[100];
scanf(%s, s); //uneori funcioneaz, dar este greit: scanf(%s, &s);
Chiar i spaiile trebuie folosite cu atenie n irul format din scanf. Exemplu de citire care poate
crea probleme la execuie din cauza blancului din format:
scanf("%d ",&a); // corect este scanf (%d,&a);
Funcia scanf nu poate afia nimic, de aceea pentru a precede introducerea de date de un mesaj (prin
care este anunat utilizatorul c se ateapt introducerea unei date) trebuie folosit secvena printf,
scanf. Exemplu:
char c;
printf("Rezultatul este: %c\n",c); //afiseaza un mesaj si un character
float a;
double b;
scanf(%f, &a); // citire variabila float
printf(%5.2f,a); // sunt afisate minim 5 caractere, maxim 2 zecimale
scanf(%lf, &b); // citire variabila double
printf(%-4.2lf,b); // afisare cu aliniere stanga
printf(%+4.2lf,b); // afisare cu adaugare semn (+,-)
Observaii
Toate funciile de citire menionate (excepie getch, getche) folosesc o zon tampon (buffer) n care
se adun caracterele tastate pn la apsarea tastei Enter, moment n care coninutul zonei buffer
este transmis programului. n acest fel este posibil corectarea unor caractere introduse greit
nainte de apsarea tastei Enter.
Caracterul \n este prezent n zona buffer numai la funciile getchar i scanf, dar funcia gets
nlocuiete acest caracter cu un octet zero, ca terminator de ir n memorie (rezultatul funciei gets
este un ir terminat cu zero).
-8-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
Funcia scanf recunoate n zona buffer unul sau mai multe cmpuri (fields), separate i terminate
prin caractere spaiu (blanc, \n, \r,\f); drept consecin, preluarea de caractere din buffer se
oprete la primul spaiu alb, care poate fi i caracterul terminator de linie. La urmtorul apel al
funciei getchar sau scanf se verifica dac n zona buffer mai sunt caractere, nainte de a atepta
introducerea de la tastatura i va gsi caracterul terminator de linie rmas de la citirea anterioar.
Pentru ca un program s citeasc corect un singur caracter de la tastatur avem mai multe soluii:
apelarea funciei fflush(stdin) nainte de oricare citire; aceast funcie golete zona buffer
asociat tastaturii i este singura posibilitate de acces la aceast zon tampon.
introducerea unei citiri false care s preia terminatorul de linie din buffer (cu getchar(), de
exemplu).
utilizarea funciei nestandard getch (declarat n conio.h), funcie care nu folosete o zon buffer
la citire
citirea unui singur caracter ca un ir de lungime 1:
char c[2]; // memorie ptr un caracter i pentru terminator de ir
scanf (%1s,c); // citete ir de lungime 1
Unele medii integrate nchid automat fereastra n care se afieaz rezultatele unui program. Pentru
meninerea rezultatelor pe ecran vom folosi fie o citire fals (pune programul n ateptare) fie
instruciunea: system(pause); din stdlib.h.
n C++ s-a introdus o alt posibilitate de exprimare a operaiilor de citire-scriere, pe lng funciile
standard de intrare-ieire din limbajul C. n acest scop se folosesc cteva clase predefinite pentru
fluxuri de I/O (declarate n fiierele antet iostream.h i fstream.h).
Un flux de date (stream) este un obiect care conine datele i metodele necesare operaiilor cu acel
flux. Pentru operaii de I/O la consol sunt definite variabile de tip flux, numite cin (console input)
respectiv cout (console output).
Operaiile de citire sau scriere cu un flux pot fi exprimate prin metode ale claselor flux sau prin doi
operatori cu rol de extractor din flux (>>) sau insertor n flux (<<). Atunci cnd primul operand este
de un tip flux, interpretarea acestor operatori nu mai este cea de deplasare binar ci este extragerea
de date din flux (>>) sau introducerea de date n flux (<<).
Operatorii << i >> implic o conversie automat a datelor ntre forma intern (binar) i forma
extern (ir de caractere). Formatul de conversie poate fi controlat prin cuvinte cheie cu rol de
"modificator".
Exemplu de scriere i citire cu format implicit:
#include <iostream.h>
void main ( ) {
int n; char s[20];
cout << " n= "; cin >> n;
cout << " un ir: "; cin >> s; cout << s << "\n";
}
ntr-o expresie ce conine operatorul << primul operand trebuie s fie cout (sau o alt variabil de
un tip ostream), iar al doilea operand poate s fie de orice tip aritmetic sau de tip char* pentru
afiarea irurilor de caractere. Rezultatul expresiei fiind de tipul primului operand, este posibil o
expresie cu mai muli operanzi (ca la atribuirea multipl).
Exemplu:
cout << "x= " << x << "\n";
n mod similar, ntr-o expresie ce conine operatori >> primul operand trebuie s fie cin sau de un
-9-
INFORMATIC*I* IB.03. Funcii de intrare/ieire n limbajul C
alt tip istream, iar ceilali operanzi pot fi de orice tip aritmetic sau pointer la caractere. Exemplu:
cin >> x >> y;
Este posibil i un control al formatului de scriere prin utilizarea unor modificatori, ns nu vom
detalia aici acest aspect, deoarece nu vom folosi aceste faciliti care in de C++, ele fiind date doar
ca titlu informativ.
- 10 -