Sunteți pe pagina 1din 16

OPERAII DE INTRARE/IEIRE CU TASTATURA/MONITORUL

Deoarece tastatura i monitorul sunt dispozitive asimilate fiierelor ASCII, operaiile de intrare/ieire se realizeaz cu conversie ntre reprezentarea intern a datelor (virgul fix, virgul mobil etc.) i cea extern (ASCII). Mecanismul operaiei de scriere este prezentat n figura 8.1, iar al operaiei de citire n figura 8.2.

Fig. 8.1. Mecanismul operaiei de scriere Scrierea pe ecran se desfoar n doi pai: datele din memoria principal (MP) sunt convertite n formatul extern de reprezentare (ASCII) i transferate ntr-o zon tampon (pasul 1), de unde sunt preluate i afiate pe ecran (pasul 2). La citire datele sunt preluate de la tastatur i depuse ntr-o zon tampon (buffer), n format ASCII (pasul 1). De aici se preiau, se convertesc n formatul intern i se depun n memoria principal, n zonele corespunztoare parametrilor funciilor de citire.

Fig. 8.2. Mecanismul operaiei de citire

Se observ c operaia de conversie are loc numai la transferul ntre zona tampon i memoria principal. n general, n zona tampon datele sunt pstrate n acelai format cu dispozitivul extern asociat. Datorit orientrii spre portabilitate, n limbajul C nu au fost implementate instruciuni de intrare/ieire. Operaiile de intrare/ieire se realizeaz prin apelul unor funcii de bibliotec. Cele mai des utilizate funcii de bibliotec pentru afiarea datelor sunt printf, puts, putch, la care se adaug macroul putchar. Cele mai des folosite funcii de bibliotec pentru citirea datelor de la tastatur sunt scanf, gets, getch, getche, la care se adaug macroul getchar. Funciile printf i scanf sunt numite funcii de intrare/ieire cu format (folosesc descriptori de format). Pentru utilizarea acestora, trebuie incluse explicit n programul surs header-e, prin directiva #include: #include <stdio.h> sau #include <conio.h> Utilizatorul i poate defini propriile funcii de intrare/ieire dac cele predefinite nu corespund necesitilor.

8.1. Descriptori de format Funciile de intrare/ieire cu format au urmtoarea structur a parametrilor: Fiecrui element din lista de intrare/ieire a operaiei de citire/scriere trebuie s-i corespund un descriptor de format n irul descriptor. Descriptorii de format se pun n coresponden cu elementele listei de intrare/ieire de la stnga la dreapta. Exemplu:
int a,b; printf("nr1=%i, nr2=%i ",a,b);

(<sir descriptor>, <list de intrare/ieire>)

n exemplu, descriptorii de format sunt precizai prin %i. Primului descriptor %i i corespunde variabila a, iar celui de-al doilea i corespunde variabila b.

irul descriptorilor de format este ncadrat ntre ghilimele (este ir de caractere). n cazul funciilor de afiare, descriptorii de format pot fi

intercalai n textul care va fi afiat. Fiecrui descriptor de format trebuie si corespund exact un element din lista de intrare/ieire. Formatele de intrare/ieire ndeplinesc simultan rolurile de: a) abloane ale modului de reprezentare extern a datelor, care ofer programatorilor un control mai bun al citirii/scrierii datelor. b) Parametri prin care se indic tipul de conversie. Forma general a unui descriptor este:
%[cadraj][lime[.precizie]]cod_conversie

Un descriptor ofer posibilitatea cadrrii i alegerea explicit a reprezentrii externe a datei. Cadrarea se face implicit la dreapta, iar modul de reprezentare extern este ales automat de compilator, n funcie de tipul datei care se afieaz. n plus, n limbajul C, toi descriptorii de format formeaz un parametru separat al funciei de intrare/ieire. Pentru scrierea datelor pe ecran se pot folosi urmtorii parametri n cadrul descriptorilor de format: Cadraj: implicit datele se aliniaz la dreapta cmpului n care se scriu; prezena unui caracter (minus) determin alinierea datelor la stnga, iar un caracter + (plus) determin alinierea la dreapta. Lime: reprezint un numr care specific limea cmpului, n numr de caractere, n care se va scrie valoarea. Dac valoarea necesit mai multe caractere dect limea dat explicit, afiarea se va face pe attea caractere cte sunt necesare. Dac limea necesar este mai mic dect cea explicit, se completeaz cu caractere nesemnificative la stnga sau la dreapta, conform cadrajului specificat. Implicit, caracterele nesemnificative sunt spaii. Dac numrul care precizeaz limea ncepe cu zero, caracterele nesemnificative sunt zerouri. Precizie: indic precizia cu care se va scrie data. Dac aceasta este o valoare real, parametrul indic numrul de zecimale afiate. Dac partea fracionar conine mai multe cifre semnificative dect precizia, se rotunjete la ultima zecimal. Dac data este un ir de caractere, indic numrul maxim de caractere care se vor afia, indiferent de lungimea irului. Cod_conversie: este format din unul sau dou caractere, cu semnificaia precizat n tabelul 8.1.

Tabelul 8.1. Semnificaia codurilor de conversie


Cod conversie d i o u x Semnificaie zecimal cu semn (int) zecimal cu semn (int) octal fr semn zecimal fr semn printf: hexazecimal fr semn (int) litere mici scanf: hexazecimal (int) printf: hexazecimal fr semn (int) litere mari scanf: hexazecimal (int) virgul mobil [-]dddd.ddd (format matematic) virgul mobil [-]d.ddd.e[+/-]dd (format tiinific) ca i f sau e, depinde de precizie ca i e, utilizeaz litera E pentru exponent ca i g, utilizeaz litera E pentru exponent imprim un singur caracter imprim caractere pn la \0 (NULL) sau pn la .prec poate s precead descriptorii d, o, x sau u, caz n care se face conversia din int spre long; dac precede descriptorul f, se face conversie din float spre double caracterul % Observaii ntregi ntregi ntregi ntregi ntregi

X f e g E G c s

ntregi virgul mobil virgul mobil virgul mobil virgul mobil virgul mobil ntregi iruri

l sau L %

ntregi %% => %

Pentru citirea datelor de la tastatur, descriptorul de format poate conine urmtorii parametri opionali: lime: un numr care specific limea maxim a cmpului din care se va citi valoarea respectiv; un caracter asterisc (se va citi de la tastatur valoarea respectiv, dar nu va fi atribuit nici unei variabile).

Dac tipul obiectului nu concord cu specificatorul de format (codul), se obin rezultate imprevizibile (compilatorul nu controleaz corespondena i ncearc s fac reprezentarea conform descriptorului). Funcii de scriere/citire cu format Pentru operaiile de citire/scriere cu format, se folosesc urmtoarele funcii definite n biblioteca standard stdio.h.:
printf(<sir_descriptor>,<expresie1>,<expresie2> ...); scanf(<sir_descriptor >,<adresa1>,<adresa2> ...);

Apelul printf transfer valori care vor fi afiate, iar apelul scanf transfer adrese ale variabilelor ale cror valori se vor citi. De aceea, la apelul funciei printf, parametrii reali pot fi variabile, constante, expresii sau apeluri de funcii care returneaz valori, n timp ce la apelul funciei scanf parametrii reali trebuie s fie adresele variabilelor ale cror valori se citesc (adresele unde se depun valorile citite de la tastatur). n cazul funciei scanf trebuie transmise explicit adresele variabilelor. n acest scop se folosete operatorul &, care extrage adresa unei variabile. Funcia printf Funcia execut scrierea datelor pe unitatea standard de ieire (implicit monitorul) i returneaz numrul de octei (caractere) afiate n caz de succes sau -1 n caz de eroare. Parametrul <sir_descriptor> al funciei printf poate conine caractere care se afieaz ca atare i descriptori de format care definesc conversiile care se aplic asupra obiectelor precizate. Funcia printf poate fi folosit pentru a afia una sau mai multe valori. Primul parametru al funciei printf are semnificaie prestabilit, fiind un ir de caractere care conine descriptorii de format pentru toate datele care urmeaz a fi afiai (urmtorii parametri). Deoarece funcia returneaz numrul de octei afiat se pot face verificri suplimentare asupra rezultatelor operaiei de afiare. Exemple:
1.
printf("abcde"); printf("%s","abcde");

Ambele apeluri au acelai efect i anume afiarea irului de caractere abcde. 2. printf("#%4c#", 'A'); Apelul are ca efect afiarea irului # A# . printf("#%-4c#", 'A'); 3. Apelul are ca efect afiarea irului #A # . 4. Apelurile
printf("#%10s#","abcde"); printf("#%-10s#","abcde"); printf("#%15.10s#","Limbajul C++");

au ca efect afiarea pe ecran a irurilor:


# abcde# #abcde # # Limbajul C#

5. printf("#%010d#",12345); Apelul are ca efect afiarea irului #0000012345# . 6. printf("#%10o",123);


printf("#%10x",123);

Apelurile au ca efect afiarea irurilor #

173#

, respectiv #

7b# .

n irul care definete formatul pot fi incluse secvene escape constituite din caracterul backslash i un alt caracter. Se pot folosi urmtoarele combinaii uzuale: \n (newline): determin trecerea cursorului la nceputul rndului urmtor al ecranului; \t (tab orizontal): determin afiarea unui caracter tab (implicit 8 spaii) pe ecran; \a (bell): determin declanarea difuzorului intern pentru un sunet de durat i frecven standard; \v (tab vertical): determin saltul cursorului cu 8 rnduri mai jos; \b (backspace): revenirea cu o poziie napoi; \r (carriage return): revenire la nceputul rndului curent. Funcia scanf Funcia execut citirea datelor de la unitatea standard de intrare (implicit tastatura) i returneaz numrul de cmpuri corect procesate. Parametrul <sir_descriptor> poate conine, n afara codurilor de conversie, caractere care vor trebui introduse ca atare de la tastatur n cadrul cmpului respectiv.

Exemplu: Dac irul descriptor conine secvena x=%d, atunci de la tastatur trebuie introdus x=<valoare>. Caracterele albe (spaiu, tab) din cadrul irului descriptor se ignor. Cmpul controlat de un specificator de format ncepe cu primul caracter curent care nu este alb i se termin n unul din cazurile urmtoare: la caracterul dup care urmeaz un caracter alb; la caracterul dup care urmeaz un caracter necorespunztor specificatorului de format care controleaz cmpul respectiv (de exemplu litere pentru tipul numeric); la caracterul prin care se ajunge la lungimea maxim a cmpului (dac lungimea a fost specificat). n cazul citirii de caractere nu se aplic aceast regul, cmpul coninnd un caracter oarecare. n cazul prezenei unui caracter * n specificatorul de format, valoarea introdus de la tastatur nu se atribuie nici unei variabile i nu i va corespunde un element din lista de intrare/ieire. Citirea se ntrerupe n cazul unei erori, n locul n care s-a produs. Eroarea poate fi cauzat de: necorespondena ntre textul curent introdus i specificatorul de format care controleaz cmpul respectiv; neconcordana ntre data din cmp i specificatorul de format sub controlul cruia se face citirea. La citire, datele externe pot fi separate prin spaiu, tab, CR/LF sau virgul sau pot fi texte externe cu lungimi prestabilite (se precizeaz lungimea textului extern). Exemple:
int x,y;

separate prin spaiu scanf("%i,%i", &x,&y); => separate prin virgul scanf("%5s%2s",x,y); => x este ir de 5 caractere, y este ir de 2 caractere
scanf("%i %i", &x,&y); =>

Deoarece numele masivelor de date sunt pointeri, atunci cnd este posibil specificarea numelui, nu mai este nevoie de operatorul &.

Exemple:
char den[20]; printf("nume: "); scanf("%s", den); /* den este pointer */

Dac se citete un element al vectorului den, trebuie procedat astfel:


char den[20]; printf("caracter: "); scanf("%c", &den[0]);/* se scrie &den[0] deoarece den[0] nu este pointer*/

Observaie: la citirea cu specificatorul de format %s, irul introdus se ncheie prin tastele <Enter> sau spaiu (chiar dac se precizeaz lungimea cmpului). Exemple:
1.
char s1[20],s2[20]; scanf("%s %s", s1,s2);

Dac de la tastatur se introduce irul Limbaje evoluate, atunci cele dou variabile vor conine: s1 valoarea Limbaje i s2 valoarea evoluate. char s1[20],s2[20]; 2.
scanf("%2s %8s",s1,s2);

Introducnd de la tastatur irul de la exemplul 1, cele dou variabile vor conine: s1 valoarea Li, deoarece se citesc maxim dou caractere i s2 valoarea mbaje, deoarece cmpul se termin la ntlnirea caracterului spaiu.

Se observ c se pot preciza lungimile cmpurilor externe din care se citesc datele prin nsi sintaxa funciilor. Folosind valoarea returnat de funcie se pot face validri asupra citirii corecte a datelor.

Funcii de intrare/ieire fr format Limbajul C are funcii de intrare/ieire dedicate lucrului cu iruri de caractere, definite n biblioteca stdio.h. Acestea sunt gets i puts. Funcia gets se apeleaz astfel:
gets(masiv_de_caractere);

unde masiv_de_caractere este adresa unde se va depune irul de caractere citit (numele vectorului de caractere).

Funcia gets este folosit pentru introducerea de la tastatur a unui ir de caractere. Spre deosebire de citirea cu scanf (cu descriptorul %s), irul citit poate conine i spaii, deoarece irul extern se termin la ntlnirea caracterului CR/LF sau CTRL/Z (terminator de fiier). Valoarea citit se memoreaz n masivul masiv_de_caractere i se returneaz adresa unde a fost depus acest ir (adresa primit ca parametru). Dac se introduce CR/LF fr a se introduce alte caractere se consider irul vid (n memorie, la adresa irului se va gsi caracterul \0). Dac se introduce numai CTRL/Z nu se citete nici un ir i se returneaz zero (pointer neiniializat). Caracterul CR/LF nu se pstreaz n irul citit, fiind nlocuit cu \0. Funcia puts se apeleaz astfel:
puts(sir);

unde sir este o expresie de tip pointer spre caracter. Funcia puts este folosit pentru afiarea unui ir de caractere pe ecran, returnnd codul ASCII al ultimului caracter afiat n caz de succes, sau 1 n caz de eroare. Dup afiarea ultimului caracter, cursorul trece la nceputul rndului urmtor. Caracterul NULL (\0) nu este afiat, fiind nlocuit cu secvena CR/LF. Funcia afieaz, ncepnd de la adresa primit ca parametru, toate caracterele pn la ntlnirea caracterului NULL (\0). Dac la adresa primit ca parametru nu se afl un ir terminat cu caracterul NULL, rezultatele sunt imprevizibile. Exemple:
char sir[80]; printf("Introduceti un text:"); gets(sir); printf("Sirul introdus este: %s\n", sir); char sir[] = "C este un limbaj de programare\n"; puts(sir);

Funciile getch i getche Ambele funcii sunt destinate citirii unui caracter de la tastatur i sunt definite n biblioteca standard conio.h. Ele nu au parametri i returneaz codul ASCII al caracterului citit. Deosebirea dintre ele const n

faptul c citirea cu getch se realizeaz fr ecou pe ecran (caracterul corespunztor tastei apsate nu este afiat pe ecran). La apelul funciei getche, pe ecran apare caracterul corespunztor tastei apsate. n cazul apsrii unei taste corespunztoare tastaturii centrale, cele dou funcii returneaz codul ASCII asociat caracterelor direct afiabile. n cazul apsrii unei taste funcionale sau a combinaiilor cu tasta CTRL, care returneaz o secven de dou caractere ASCII, funciile trebuie apelate de dou ori: prima dat se returneaz codul null, iar a doua oar se returneaz codul ASCII al tastei apsate. La apsarea tastei Enter se returneaz valoarea 13. Exemplu: Programul urmtor afieaz codurile tastelor apsate, pn cnd se apas tasta
Enter.
#include<stdio.h> #include<conio.h> void main() { unsigned char c,c1; do {printf("\n"); c=getch(); printf("\t >> %d",c); if(!c) {c1=getch(); printf(", %d",c1);} } while(c!=13); getch();}

Rezultatul apsrii irului de taste <Esc> F1 F12 a A <sgeat sus> <sgeat


jos> <Enter>

este urmtorul (pe fiecare rnd a fost afiat secvena codurilor corespunztoare combinaiei de taste):
>> >> >> >> >> >> >> >> >> >> >> >> 27 0, 0, 97 65 0, 0, 0, 0, 0, 0, 13 59 134

<sgeat

stnga>

<sgeat

dreapta>

<page

up>

<page

down>

72 80 75 77 73 81

Funcia putch Funcia putch este definit n biblioteca standard conio.h. Funcia are ca parametru o valoare ntreag i are ca efect afiarea caracterului ASCII corespunztor. Dac parametrul are valori n intervalul 031, se vor afia caractere grafice nestandard, corespunztoare caracterelor ASCII de control (cu excepia caracterelor nul i bell, pentru care nu se afieaz nimic, backspace care va produce revenirea cu o poziie napoi pe rndul curent, LF (cod 10) care produce trecerea pe rndul urmtor n aceeai coloan i CR (cod 13) care va produce revenirea la nceputul rndului curent). Dac parametrul are valori n intervalul 32127 se vor afia caracterele corespunztoare tastaturii centrale (caractere direct afiabile/imprimabile). Dac parametrul are valori n intervalul 128255 se vor afia caracterele grafice standard. Dac parametrul are valoare n afara domeniului 0255, atunci se afieaz caracterul corespunztor interpretrii ca valoare n virgul fix aritmetic a primului octet din reprezentarea valorii respective (conform tipului ei) octetul cel mai puin semnificativ, deoarece n reprezentarea intern ordinea octeilor este inversat. Se poate face calculul pentru a prevedea ce caracter va fi afiat. Pentru valori peste 255, calculul este simplu: dac v este valoarea primit, se afieaz caracterul cu codul v%256. Exemple:
pentru valoarea 2561 se va afia caracterul cu codul 1 (2561%256=1); pentru valoarea 45 se afieaz caracterul cu codul 211 (reprezentarea binar n virgul fix algebric a lui 45 este 11010011, pe un octet; interpretarea n virgul fix aritmetic este 211); pentru valoarea 1234 se afieaz caracterul cu codul 46 (reprezentarea binar n virgul fix algebric a lui 1234 este 11111011. 00101110, pe doi octei punctul a fost pus din motive de lizibilitate, pentru a separa octeii el nu face parte din reprezentare; octetul cel mai nesemnificativ este 00101110; interpretarea n virgul fix aritmetic este 46). pentru valoarea 54321 se afieaz caracterul cu codul 207 (reprezentarea binar n virgul fix algebric a lui 54321 este 11111111.11111111.00101011. 11001111, pe patru octei punctele au fost puse din motive de lizibilitate, pentru a

separa octeii ele nu fac parte din reprezentare; octetul cel mai nesemnificativ este 11001111; interpretarea n virgul fix aritmetic este 207). programul urmtor afieaz caracterele ASCII (sau corespondentele lor grafice, pentru caracterele de control i neimprimabile) i codurile lor. Din motive legate de aezarea rezultatului n pagin, s-au afiat cte 8 perechi cod/caracter pe un rnd.
#include<stdio.h> #include<conio.h> void main() { unsigned char c; int i,j; clrscr(); for(i=0;i<32;i++) {for(j=0;j<8;j++) {printf(" %3d ",i*8+j); putch(i*8+j);} printf("\n");} getch();}

Rezultatele execuiei programului sunt:


0 8 14 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 168 176 1 ! ) 1 9 A I Q Y a i q y 2 " * 2 : B J R Z b j r z 11 3 19 27 35 43 51 59 67 75 83 91 99 107 115 123 131 139 147 155 163 171 179 # + 3 ; C K S [ c k s { 12 4 20 28 36 44 52 60 68 76 84 92 100 108 116 124 132 140 148 156 164 172 180 $ , 4 < D L T \ d l t | 13 5 21 29 37 45 53 61 69 77 85 93 101 109 117 125 133 141 149 157 165 173 181 % 5 = E M U ] e m u } 6 22 30 38 46 54 62 70 78 86 94 102 110 118 126 134 142 150 158 166 174 182 & . 6 > F N V ^ f n v ~ 7 23 31 39 47 55 63 71 79 87 95 103 111 119 127 135 143 151 159 167 175 183 ' / 7 ? G O W _ g o w

( 0 8 @ H P X ` h p x

15 17 25 33 41 49 57 65 73 81 89 97 105 113 121 129 137 145 153 161 169 177

10

18 26 34 42 50 58 66 74 82 90 98 106 114 122 130 138 146 154 162 170 178

Se observ: - pe rndul al doilea al rezultatului deplasarea cu o poziie napoi (practic pe ecran avem o deplasare aparent de 2 poziii: una prin revenire i una prin neafiarea caracterului curent) prin afiarea caracterului backspace (cod 8); - i trecerea pe rndul urmtor, fr a schimba coloana curent la afiarea caracterului line feed (LF, cod 10); - revenirea la nceputul rndului curent la afiarea caracterului carriage return (CR, cod 13) i afiarea acolo a celorlalte caractere din rndul curent (codurile 14 i 15).

184 192 200 208 216 224 232 240 248

185 193 201 209 217 225 233 241 249

186 194 202 210 218 226 234 242 250

187 195 203 211 219 227 235 243 251

188 196 204 212 220 228 236 244 252

189 197 205 213 221 229 237 245 253

190 198 206 214 222 230 238 246 254

191 199 207 215 223 231 239 247 255

Macro-urile getchar i putchar Cele dou macro-uri sunt definite n biblioteca stdio.h i se apeleaz ca i funciile getch i putch. Diferena const n modul de execuie. Macroul getchar permite citirea cu ecou pe ecran a caracterelor de la tastatur. Se pot citi numai caractere asociate codurilor ASCII direct afiabile, nu i caracterele corespunztoare tastelor speciale. Citirea nu se face direct de la tastatur. Toate caracterele tastate se introduc ntr-o zon tampon pn la apsarea tastei Enter. n acest moment se introduce n zona tampon caracterul newline \n i macro-ul returneaz codul ASCII al caracterului curent din zona tampon. La urmtorul apel al lui getchar se returneaz codul urmtorului caracter din zona tampon. Dac la un apel al lui getchar nu mai sunt caractere disponibile n zona tampon se introduc din nou de la tastatur caractere pn la apsarea tastei Enter. La ntlnirea caracterului CTRL-Z, macro-ul returneaz valoarea EOF, definit n stdio.h. Macroul putchar are ca parametru o expresie al crei rezultat reprezint codul ASCII al caracterului care se dorete s fie afiat. Se returneaz codul ASCII al caracterului afiat sau -1 n caz de eroare. Exemple:

#include<stdio.h> #include<conio.h> void main() { putchar(getchar()); putchar(\n);}

Programul ateapt introducerea de la tastatur a unui ir de caractere ASCII direct afiabile (orice altceva este ignorat) terminat cu Enter. Primul caracter din irul introdus va fi preluat de macroul getchar care returneaz codul ASCII al caracterului respectiv. Macroul putchar primete ca parametru codul ASCII returnat de getchar i afieaz caracterul corespunztor. Ca urmare, pe ecran se va afia primul caracter introdus de la tastatur.
#include<stdio.h> #include<conio.h> void main() { char c; do putchar(c=getchar()); while(c!=EOF); putchar(\n); }

La primul apel al lui getchar, programul ateapt introducerea de la tastatur a unui ir de caractere ASCII direct afiabile (orice altceva este ignorat) terminat cu Enter. La fel ca nainte, primul caracter va fi afiat. La urmtoarele apeluri, se preia cte un caracter din cele introduse anterior i se afieaz. Dac n buffer nu mai sunt caractere, se ateapt din nou introducerea unui ir terminat cu Enter.

n aplicaiile practice, pentru muli algoritmi, datele de intrare sunt furnizate de la dispozitivul standard de intrare tastatura. Cnd numrul acestor date de intrare nu este cunoscut, programatorul trebuie s stabileasc modaliti de finalizare a procesului de introducere a datelor. Astfel, exist dou forme generale de a ncheia procesul de introducere: sfrit convenional i sfrit standard. Prin sfrit convenional nelegem situaia n care programatorul i stabilete un criteriu (condiie) de ncheiere a procesului de introducere a datelor. Convenia astfel stabilit este n strns legtur cu tipul datelor de intrare. De exemplu, dac datele de intrare sunt de tip numeric se poate

stabili o valoare a datelor care n mod normal este imposibil (zero, negativ, mult prea mare, mult prea mic etc.). Prin sfrit standard nelegem blocarea logic a tastaturii ca dispozitiv standard de intrare. Tastatura are asociat o component logic, care n limbajul C este fiierul ASCII stdin. Blocarea logic a tastaturii coincide cu operaia de nchidere a fiierului stdin. Acest lucru se realizeaz prin combinaia de taste CTRL-Z. n limbajul C, detectarea sfritului standard de prelucrare se realizeaz prin apelarea funciei feof, predefinit n biblioteca stdio.h i care are urmtoarea sintax: [Kernighan et al., 1988]
int feof(FILE *numefisier) /* pentru tastatura, numefisier va fi stdin*/

Funcia feof furnizeaz valoarea indicatorului de sfrit de fiier, care este setat de ultima operaie de citire. Astfel, dac operaia de citire a fost cu succes (fr eroare), feof va returna o valoare nenul, iar dac s-a citit sfrit de fiier (CTRL-Z, n cazul sfritului standard), feof va returna valoarea zero. Exemple:
1. Citirea caracter cu caracter a elementelor unui ir de maxim 100 de caractere, pn la apsarea combinaiei CTRL-Z (sfrit standard).
#include<stdio.h> #include<conio.h> void main() { char text[100], c, n=0; scanf("%c", &c); while(!feof(stdin)) { text[n] = c; n++; scanf("%c", &c); } printf("Sirul de caractere citit este: \n"); for(int j = 0;j<n;j++) printf("%c", text[j]); getch(); }

2. Citirea elementelor unui vector de maxim 200 de valori reale i contorizarea acestora, pn la apsarea combinaiei CTRL-Z (sfrit standard). La final se realizeaz afiarea elementelor.
#include<stdio.h> #include<conio.h> void main() { float x[200], n=0; printf("Introduceti elementele vectorului:\n"); scanf("%f", &x[n]); while(!feof(stdin)) { n++; scanf("%f", &x[n]); /* echivalente cu scanf("%f", &x[++n]);*/ } printf("Vectorul citit este:\n"); for(int i=0;i<n;i++) printf("%3.2f ",x[i]); getch(); }