El lenguaje C proporciona un conjunto bastante amplio de capacidades de entrada/salida de información hacia los diversos dispositivos como teclado y monitor. A este tipo de capacidades lo llamamos entrada/salida de flujo de datos.

En las operaciones de entrada (stdin), los bytes fluyen desde un dispositivo (teclado, archivo, red) hacia la memoria principal. En operaciones de salida (stdout) los bytes fluyen de la memoria principal hacia un dispositivo (pantalla, impresora, archivo, puertos, etc.). En ambos casos es necesario que el programador proporcione información del tipo de dato que fluye, ya que C no es capaz de determinarlos automáticamente, para ello se emplea una literal a al que denominaremos “plantilla de dato”.

Las funciones de entrada y salida no forman parte del lenguaje C propiamente dicho, sino que están en una biblioteca o librería llamada <stdio.h>. Todo programa que utilice funciones de entrada y salida estándar deberá contener la línea: #include <stdio.h>

FUNCIONES DE ENTRADA / SALIDA CON FORMATO

1. Funciones de Salida con formato

La función printf permite dar salida a mensajes y valores de variables, y es una de las mas utilizadas para mostrar información en pantalla. (La salida estándar por defecto será el monitor, aunque puede ser sustituida por algún otro dispositivo como la impresora). La función printf trabaja principalmente con dos tipos de elementos:

printf (“Mi edad es: %d \n”, edad);

Por ejemplo, suponga que se desea imprimir en pantalla la información referente a la edad y el sueldo de un empleado:

 

 

 

 

 

Los símbolos de %d corresponden a los caracteres de control de formato (éstos aplican tanto a la entrada como a la salida de datos):

Un entero colocado entre el signo % y el comando de formato, actúa como un especificador de anchura de campo mínimo. Por ejemplo, en el programa anterior podríamos haber desplegado el valor de tipo flotante ajustado a 2 décimas, sin importar la cantidad de enteros.

printf (“la edad es %d y su salario es %.2f \n”, edad, salario);

Con los especificadores %d, %i, %o, %u, y %x es posible emplear en combinación la letra l y h para describir tipos de datos largos (long) y cortos (short) respectivamente; por ejemplo, %hd indica un entero corto. Con los especificadores %e, %f, y %g la letra l indicara un flotante de doble precisión, además éstos especificadores pueden ser precedidos de del carácter #, de manera que podamos asegurar que el punto flotante estará presente inclusive si no hay decimales.

También es posible combinar los especificadores de tipo de dato con las constantes de secuencias de escape para darle formato a la salida de nuestros programas. Las siguientes secuencias de escape pueden ser usadas para imprimir caracteres especiales.

Un ejemplo del uso de estos caracteres de escape es el siguiente:

 

 

 

 

 

2. Funciones de Entrada con formato

La función scanf permite leer el flujo de datos de stdin (entrada estándar), de acuerdo al formato dado por la “plantilla”, es decir por el (%), y almacena los datos en los argumentos correspondientes (variables).

Los caracteres de control para las funciones de entrada son precedidos por un signo %, de manera similar a la empleada en la función printf. Los caracteres de control son como sigue:

scanf lee la entrada de datos, y concuerda los caracteres con el formato. Cuando un carácter de control es leído, este pone el valor en la siguiente variable. Los espacios en blanco (tabulador, espacios, etc.) son omitidos. Cualquier carácter de no espacio en blanco puede ser concordado con la entrada. Si un numero es colocado entre el símbolo % y el carácter de control, entonces únicamente esa cantidad de caracteres será convertido a la variable indicada. Si scanf encuentra un conjunto de caracteres, denotado por el carácter de control %[ ], entonces cualquier carácter encontrado entre los paréntesis cuadrados será leído por la variable.

Debido a que C fue concebido como un lenguaje muy cercano al manejo de la memoria de la computadora, la captura de datos debe ser enviada directamente a la dirección de la variable en memoria, por lo que es necesario anteponer el símbolo & (amperson) a todas las variables involucradas en la captura. Mas adelante veremos que éste símbolo nos permite obtener la dirección de la variable en memoria, elemento indispensable en el manejo de punteros.

A continuación se presenta un ejemplo donde se realiza un proceso de captura de datos, se considera un dato tipo char, int y float. Observe que la plantilla corresponde a cada uno de los datos que se pretende capturar, además cada una de las variables que se pretenden capturar tienen de manera antepuesta el símbolo &.

 

 

 

 

 

Recuerda que es posible capturar múltiples variables en la misma instrucción scanf, aunque se recomienda utilizar una instrucción scanf por cada variable, ya que esto reduce en ocasiones la posible confusión al momento de la captura ya que se puede solicitar el dato preciso, reduciendo la posibilidad de un ingreso erróneo de datos.

De ésta manera es posible reescribir el programa anterior, de modo que luzca mas ordenado:

#include <stdio.h>

 

 

 

 

 

FUNCIONES DE ENTRADA / SALIDA SIN FORMATO

1. Funciones de salida sin formato

Las operaciones de salida de datos sin formato se realizan con bytes, lo cual significa que no se pueden utilizar los formatos (%). Existen diversas funciones para mostrar datos en pantalla, cabe señalar que estas funciones solo permiten mostrar caracteres y/o cadenas:

putchar(carácter) y putc(carácter).

Ambas funciones muestran un carácter en pantalla. Es el equivalente a printf(“%c”,carácter);

Ejemplo empleando la función putchar: imprimir las vocales del abecedario.

 

 

 

 

 

 

El mismo efecto puede ser producido con la función putc, solo que hay que especificar la salida por defecto a la que se enviara, puede ser un archivo o la salida estándar (monitor).

 

 

 

 

puts(cadena).

Muestra una cadena en pantalla. Es el equivalente a printf(“%s”,cadena);

Un ejemplo de esta función es:

 

 

NOTA: La mayoría de los sistemas operativos utilizan buffers para gestionar las operaciones de entrada/salida, por lo que no se leerá un carácter hasta que el usuario introduzca un ENTER y, posiblemente, no se mostrará nada por pantalla hasta que se tenga una línea completa por mostrar.

2. Funciones de entrada sin formato

Las operaciones de entrada de datos sin formato se realizan con bytes, lo cual significa que no se pueden utilizar los formatos (%). Existen diversas funciones para leer datos desde teclado y cabe señalar que estas funciones solo permiten leer o capturar caracteres y/o cadenas:

getchar(carácter).

Esta función permite capturar un carácter a la vez. Esto equivale a scanf(“%c”,&carácter); Por ejemplo, podemos capturar cualquier carácter desde teclado simple y mostrar el valor en pantalla:

 

 

 

 

 

La función getchar requiere que el usuario presione la tecla ENTER de manera que el flujo de datos sea empujado y la ejecución de la función termine.

getch() y getche()

Estas funciones realizan un proceso similar que getchar solo que no requieren que se presione la tecla ENTER para ser ingresadas en el flujo de datos. Estas funciones están disponibles en una librería llamada <conio.h>.

NOTA: La librería <conio.h> alguna vez fue propiedad exclusiva de Borland, aunque es posible encontrar implementaciones de la misma en varios compiladores diferentes a Borland. Desafortunadamente el comportamiento de éstas funciones no se rigen bajo el estándar de ANSI C, y más aún, son imposibles de usar en el esquema de POXIS (Unix). Lo cual significa que esta librería no existe en DevC++, pero si es posible implementarla.

Ejemplo de uso de getche() para determinar cuantas veces se repite una vocal. La lectura se termina cuando se presiona la letra x.

 

 

 

 

 

 

 

 

 

gets(cadena)

Esta función lee una cadena desde el teclado. Equivale a scanf(“%s”,cadena);

Un ejemplo con gets es el siguiente: