2.3. Macrourile getchar si putchar

2018/12/31 in Programare in C

Aceste macrouri sunt definite in fisierul stdio.h.

Macroul getchar permite citirea cu ecou a caracterelor de la terminalul standard. Se pot citi numai caractere ale codului ASCII, nu si caractere corespunzatoare tastelor speciale. Prin intermediul macroului getchar caracterele nu se citesc direct de la tastatura. Caracterele tastate la terminal se introduc intr-o zona tampon pana la actionarea tastei Enter. In acest moment, in zona tampon, se introduce caracterul rand nou newline si se continua executia lui getchar. Se revine din getchar returnandu-se codul ASCII al caracterului urmator din zona tampon. La un nou apel al lui getchar se revine cu codul ASCII al caracterului urmator din zona tampon. La epuizarea tuturor caracterelor din din zona tampon, apelul lui getchar implica tastarea la terminal a unui nou set de caractere care se incarca in zona tampon.

Un astfel de mod de desfasurare a operatiei de citire implica o anumita organizare a memoriei si a accesului la caractere, organizare ce duce la ideea de fisier.

In general, prin fisier se intelege o multime ordonata de elemente pastrate pe suporturi. Elementele unui fisier se numesc inregistrari. In mod frecvent, fisierele sunt pastrate pe discuri. Cu toate acestea, este util sa se considere organizate in fisiere chiar si datele care se tasteaza sau se afiseaza la terminal. In acest caz, inregistrarea este un rand afisat la terminal sau succesiunea de caractere tastata la terminal si terminata cu Enter.

Fisierele contin o inregistrare speciala care marcheaza sfarsitul de fisier. Macroul getchar returneaza valoarea constantei simbolice EOF (End Of File) la intalnirea sfarsitului de fisier. Aceasta constanta este definita in stdio.h. Valoarea ei depinde de implementare. In Turbo C si Turbo C++ ea are valoarea -1.

Macroul getchar se apeleaza fara parametri si de obicei este un operand al unei expresii: getchar().

Macroul putchar afiseaza un caracter al codului ASCII. El returneaza codul caracterului afisat sau -1 la eroare. Se poate apela folosind formatul: putchar(expresie);.

Valoarea expresiei reprezinta codul ASCII al caracterului care se afiseaza.

Observatii:

1. Citirea caracterelor prin intermediul zonelor tampon are avantajul ca permite corectarea erorilor la tastare, inainte de a tasta Enter.

2. Macroul getchar returneaza valoarea 10 (newline) la citirea caracterului corespunzator tastei Enter.

3. Apelul putchar(10); sau echivalentul sau putchar('\n'); are ca efect trecerea cursorului la o linie noua.

Exercitiu:

2.4. Sa se scrie un program care citeste un caracter folosind macroul getchar, il afiseaza folosind macroul putchar, trece cursorul in coloana unu din linia urmatoare si apoi afiseaza fereastra utilizator pana la actionarea unei taste.

Acest exercitiu este analog cu 2.3. In acest caza se cere schimbarea funtiilor getch si putch cu macrourile getchar si putchar.

#include <stdio.h>
#include <conio.h>

main() /*- citeste un caracter folosind getchar; 
	 - afiseaza caracterul folosind putchar; 
	 - trece cursorul la inceputul randului urmator; 
	 - blocheaza programul pana la tastarea unui caracter.*/
{
   putchar(getchar());
   putchar('\n');
   getch();
}

Observatie:

Deoarece se foloseste macroul getchar, operatorul va tasta un caracter ASCII care trebuie sa fie urmat de actionarea tastei Enter. Fara actionarea tastei Enter, programul ramane in asteptare. Dupa Enter se va reveni din getchar cu valoarea codul ASCII al primului caracter tastat.

Daca prima tasta actionata este chiar Enter, atunci programul continua executia in mod automat si se revine din getchar cu valoarea 10 (corespunzatoare tastei Enter).

2.4. Functiile gets si puts