Documente Academic
Documente Profesional
Documente Cultură
Funcii de intrare/ieire n C
Funcii de citire/scriere pentru caractere i iruri de caractere
Funcii de citire/scriere cu format
Funcia printf
Funcia scanf
Observaii
Fluxuri de intrare/ieire in C++
Funcii de intrare/ieire n C
n limbajul C, nu exist instruciuni de intrare/ieire (citire/scriere), tocmai pentru a mri
portabilitatea limbajului. Pentru a realiza citiri i scrieri se apeleaz funcii de intrare/ieire
din bibliotecile mediului de programare.
Pentru operaii de citire a datelor iniiale i de afiare a rezultatelor sunt definite funcii
standard, declarate n fiierul antet stdio.h. Se vor prezenta i funciile de intrare/ieire
nestandard cele mai uzuale, avnd prototipul in conio.h. Utilizarea acestor funcii ntr-un
program, va presupune deci, includerea respectivelor fiiere antet.
Aici vom prezenta numai acele funcii folosite pentru citire de la tastatur i pentru afiare
pe ecran, deci pentru lucru cu fiierele standard numite stdin i stdout. Fiierele standard
stdin i stdout sunt fiiere text. Un fiier text este un fiier care conine numai caractere
ASCII grupate n linii (de lungimi diferite), fiecare linie terminat cu un terminator de linie
format din unul sau dou caractere. n sistemele Windows se folosesc dou caractere ca
terminator de linie: \n i \r, adic newline (trecere la linie nou) i return (trecere la nceput
de linie). n sistemele Unix/Linux se folosete numai caracterul \n (newline) ca terminator de
linie, caracter generat de tasta Enter.
Funciile I/O ( Input/Output - intrare/ieire ) din C pot fi grupate n cteva familii:
Funcii de citire/scriere caractere individuale: getchar, putchar, getch, putch;
Funcii de citire/scriere linii de text: gets, puts;
Funcii de citire/scriere cu format (cu conversie): scanf, printf.
Funcii de citire/scriere pentru caractere i iruri de caractere
Pentru operaiile I/O la nivel de caracter:
int getchar ();
int putchar (int c);
int getche ();
int getch ();
int putch (int c);
Funcie
Exemple
Descriere
Rezultat
int getchar();
char c;
c=getchar();
Citete un caracter
char c;
c=getche();
int getch();
char c;
c=getch();
char c;
putch(c);
Tiprete pe ecran
transmis ca parametru
caracterul
Funciile getch, putch, getche nu sunt standard, de aceea este bine s se evite utilizarea lor!
Tabelul urmtor conine o descriere detaliat a funciilor pentru operaiile I/O cu iruri de
caractere:
Funcie
Exemple
utilizare
Descriere
Rezultat
char sir[10];
gets(sir);
Returneaz
adresa
primului caracter din ir.
Dac se tasteaz CTRL+Z
returneaz NULL.
char sir[10];
puts(sir);
Citete caractere pn la
ntlnirea lui Enter; acesta
nu se adaug la irul s.
Plaseaz /0 la sfritul lui s.
Obs: codul lui Enter e scos
din buffer-ul de intrare.
Tiprete irul primit ca
parametru, apoi NewLine,
cursorul
trecnd
la
nceputul rndului urmtor
Funcia printf
Descriptorii de format admii n funcia printf sunt:
Specificatori format
Descriere
%d
%i
%o
%u
%x, %X
%c
caracter
%s
%f, %F
%e, %E
%g, %G
%p
%ld, %li
%%
caracterul procent
int a=3;
printf ("%d\n",a);
// scrie 3 ca ntreg i trece la linia urmtoare
int a=5, b=7;
printf ("a=%d b=%d\n", a, b);
//scrie a=5 b=7 i trece la linia urmtoare
int g=30, m=5, s=2;
printf ("%2d grade %2d min %2d sec\n", g,m,s);
// scrie 30 grade 5 min
2 sec i schimba linia
int anInt = 12345;
float aFloat = 55.6677;
double aDouble = 11.2233;
char aChar = 'a';
char aStr[] = "Hello";
printf("The
printf("The
printf("The
printf("The
printf("The
//The
//The
//The
//The
//The
int is 12345.
float is 55.667702.
double is 11.223300.
char is a.
string is Hello.
Funciile scanf i printf folosesc noiunea de cmp (field): un cmp conine o valoare i este
separat de alte cmpuri prin spaii albe. 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.
Exemple:
printf("%d %d",a,b);
printf("%8d8%d",a,b);
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:
int a=203, b=5, c=16;
printf (%10d \n %10d \n %10d \n,a,b,c);
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).
La formatul %g printf alege ntre formatul %f sau %e n funcie de ordinul de mrime
al numrului afiat: pentru numere foarte mari sau foarte mici formatul cu exponent, iar
pentru celelalte formatul cu parte ntreag i parte fracionar.
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.
//xx
Helloxx
//xxHello
xx
Specificatori format
Descriere
%d
%i
%o
%u
%x, %X
%c
%s
%ld, %li
%lf
%Lf
%*+
%*^+
%%
caracterul procent
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 albe 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);
scanf("%d%d", &a,&b);
float rad;
scanf("%f", &rad);
char c;
scanf("%c", &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);
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, iar pentru a precede introducerea de date de un mesaj
trebuie folosit secvena printf, scanf. Exemplu:
printf ("n= ");
scanf ("%d", &n);
//
//
//
//
//
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).
Funcia scanf recunoate n zona buffer unul sau mai multe cmpuri (fields), separate i
terminate prin caractere spaiu alb (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. Urmtorul apel al funciei getchar sau scanf se uit n zona buffer dac mai sunt
caractere, nainte de a atepta introducerea de la taste 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];
scanf (%1s,c);
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.
Fluxuri de intrare/ieire in C++
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;
}
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 alt tip istream, iar ceilali operanzi pot fi de orice tip aritmetic sau pointer la caractere.
Exemplu:
cin >> x >> y;