Curso de C++ (Página 9b)

pagina009a Principal pagina009c

CAPITULO 9b Librerías estándar

Librería de entrada y salida estándar "stdio.h"

En esta librería están las funciones de entrada y salida, tanto de la pantalla y teclado como de ficheros. "stdio" puede y suele leerse como estándar Input/Output. De hecho la pantalla y el teclado son considerados como ficheros, aunque de un tipo algo peculiar. La pantalla es un fichero sólo de escritura llamado "stdout", o salida estándar y el teclado sólo de lectura llamado "stdin", o entrada estándar.

Se trata de una librería ANSI C, por lo que está heredada de C, y ha perdido la mayor parte de su utilidad al ser desplazada por "iostream". Pero aún puede ser muy útil, es usada por muchos programadores, y la encontrarás en la mayor parte de los programas C y C++.

Veamos ahora algunas funciones.

Función "getchar()"

Sintaxis:

int getchar(void);

Lee un carácter desde "stdin".

"getchar" es una macro que devuelve el siguiente carácter del canal de entrada "stdin". Esta macro está definida como "getc(stdin)".

Valor de retorno:

Si todo va bien, "getchar" devuelve el carácter leído, después de convertirlo a un "int" sin signo. Si lee un Fin-de-fichero o hay un error, devuelve EOF.

Ejemplo:

do {
   a = getchar(); 
} while (a != 'q'); 

En este ejemplo, el programa permanecerá leyendo el teclado mientras no pulsemos la tecla 'q'.

Función "putchar()"

Sintaxis:

int putchar(int c);

Envía un carácter a la salida "stdout".

"putchar(c)" es una macro definida como "putc(c, stdout)".

Valor de retorno:

Si tiene éxito, "putchar" devuelve el carácter c. Si hay un error, "putchar" devuelve EOF.

Ejemplo:

while(a = getchar()) putchar(a); 

En este ejemplo, el programa permanecerá leyendo el teclado y escribirá cada tecla que pulsemos, mientras no pulsemos '^C', (CONTROL+C). Observa que la condición en el "while" no es "a == getchar()", sino una asignación. Aquí se aplican, como siempre, las normas en el orden de evaluación en expresiones, primero se llama a la función getchar(), el resultado se asigna a la variable "a", y finalmente se comprueba si el valor de "a" es o no distinto de cero. Si "a" es cero, el bucle termina, si no es así continúa.

Función "gets()"

Sintaxis:

char *gets(char *s);

Lee una cadena desde "stdin".

"gets" lee una cadena de caracteres terminada con un retorno de línea desde la entrada estándar y la almacena en s. El carácter de retorno de línea es reemplazado con el carácter nulo en s.

Observa que la manera en que hacemos referencia a una cadena dentro de la función es "char *", el operador * indica que debemos pasar como argumento la dirección de memoria donde está almacenada la cadena a leer. Veremos la explicación en el capítulo de punteros, baste decir que a nivel del compilador "char *cad" y "char cad[]", son equivalentes, o casi.

"gets" permite la entrada de caracteres que indican huecos, como los espacios y los tabuladores. "gets" deja de leer después de haber leído un carácter de retorno de línea; todo aquello leído será copiado en s, incluido en carácter de retorno de línea.

Esta función no comprueba la longitud de la cadena leída. Si la cadena de entrada no es lo suficientemente larga, los datos pueden ser sobrescritos o corrompidos. Más adelante veremos que la función "fgets" proporciona mayor control sobre las cadenas de entrada.

Valor de retorno:

Si tiene éxito, "gets" devuelve la cadena s, si se encuentra el fin_de_fichero o se produce un error, devuelve NULL. Ejemplo:

char cad[80]; 
do { 
   gets(cad); 
} while (cad[0] != '\000'); 

En este ejemplo, el programa permanecerá leyendo cadenas desde el teclado mientras no introduzcamos una cadena vacía. Para comprobar que una cadena está vacía basta con verificar que el primer carácter de la cadena es un carácter nulo.

Función "puts()"

Sintaxis:

int puts(const char *s);

Envía una cadena a "stdout".

"puts" envía la cadena s terminada con nulo a la salida estándar "stdout" y le añade el carácter de retorno de línea.

Valor de retorno:

Si tiene éxito, "puts" devuelve un valor mayor o igual a cero. En caso contrario devolverá el valor EOF.

Ejemplo:

char cad[80]; 
int i; 
do { 
   gets(cad); 
   for(i = 0; cad[i]; i++) 
      if(cad[i] == ' ') cad[i] = '_'; 
   puts(cad); 
} while (cad[0] != '\000'); 

Empezamos a llegar a ejemplos más elaborados. Este ejemplo leerá cadenas en "cad", mientras no introduzcamos una cadena vacía. Cada cadena será recorrida carácter a carácter y los espacios de sustituirán por caracteres '_'. Finalmente se visualizará la cadena resultante.

Llamo tu atención ahora sobre la condición en el bucle "for", comparándola con la del bucle "do while". Efectivamente son equivalentes, al menos para i == 0, la condición del bucle "do while" podría haberse escrito simplemente como "while (cad[0])". De hecho, a partir de ahora intentaremos usar expresiones más simples.


pagina009a Principal pagina009c