Lenguaje de programación C (XII). Entrada/Salida

La entrada/salida con C se realiza utilizando la biblioteca estándar. En función del criterio se pueden distinguir los siguientes tipos de entradas/salidas:

  1. Para el fichero: estándar/explícito
  2. Atendiendo al formato: sin formato/con formato
  3. Atendiendo al tipo de acceso: secuencial/directo

Las funciones scanf y print vistas hasta el momento trabajan con archivos estándar, con formato y acceso secuencial.

Entrada/salida sobre ficheros estándar

Los archivos estándar que maneja C son tres: stdin para entrada, stdout para salida y stob para mensajes de error. Estos ficheros son proporcionados por el sistema operativo (abiertos) al programa principal para su uso directo. Los archivos estándar son por defecto el teclado y la pantalla, pero se pueden redirigir a través del sistema operativo. Los caracteres < y > en unix y dos se utilizan para ello. Las funciones scanf y print mencionadas en la biblioteca de C son otras y más importantes para trabajar con archivos estándar de entrada/salida: getchar, putchar, gets y puts. Las planas son sin formato y mientras las dos primeras leen o escriben un solo carácter, las otras manejan una línea completa. Su gestión se encuentra en el fichero stdio.h, al igual que el resto de funciones de entrada/salida, y son las siguientes:

extern int getchar ( );extern int putchar (int);extern char * gets (char*);extern int puts (char*);

En los programas 1 y 2 se puede ver cómo utilizar las funciones getc y gets. En ambos ejemplos se define la función que lee una línea y calcula la longitud de la línea.

Programa 1. Utilización de la función getchar.
Programa 2. Utilización de la función gets.

Acceso/Salida

El concepto de fichero para C es general, ya que en él se incluyen tanto los dispositivos (teclado, pantalla, impresora, ...) como los ficheros de la memoria auxiliar (discos, disquetes, cintas, ...).

Al igual que en otros lenguajes, este fichero debe abrirse para que la información de control correspondiente se cargue en memoria y sea consultada por las funciones básicas de entrada/salida del sistema operativo. Esta información de control se almacena en una estructura denominada FILE (definida en el fichero stdio.h) cuando se abre el fichero y la usaremos con un puntero, ya que al llamar las funciones sobre un fichero la referencia de su estructura FILE debe ser mencionada como argumento.

Por tanto, para el uso de los ficheros, en los programas C se definirá una variable del tipo FILE * para que al abrirlos (con la función de los fops) reciba el resultado y pueda ser utilizada como parámetro en el resto de funciones de entrada/salida.

En la tabla 1 se muestra una lista de funciones de entrada/salida que manejan la estructura FILE, en la que se muestran tanto el tipo de datos del parámetro y resultado como una explicación breve.

Todas las funciones descritas en la tabla 1, excepto el fseek, se utilizan en acceso secuencial sobre un fichero permanentemente abierto para el manejo de caracteres (fgetc, fputc), líneas (fgets, fputs), registros (fread, fwrite) o situaciones especiales (feof, ferror). Si se determina stdin o stdout donde se debe colocar fp, la función se realiza sobre la entrada o salida estándar.

Tabla . Modos de utilizar la función de fop.

Las lecturas y escrituras se realizan en la posición actual, inicializando esta posición con la función de fopen y actualizándola en cada captura. Dependiendo del parámetro de la función de fops, además de seleccionar la posición actual, se definen las operaciones que pueden llevarse a cabo, tal y como se muestra en la tabla 2.

Tabla . Funciones de entrada/salida.

En el Programa 3 se utilizan las funciones de E/S para la redacción del programa cat utilizado en UNIX. Mediante este programa se anotan los ficheros que pasan como argumento, uno detrás de otro en la salida estándar. Los argumentos se manejan mediante las variables argc y argv, tal y como vimos en el capítulo 10.

Programa 3. Programa cat que realiza el encadenado de los ficheros.

Acceso directo

Como se ha visto en los ejemplos, las funciones de E/S básicas de la biblioteca (fgetc, fputc, freda, fwrite, ...) facilitan el acceso secuencial, ya que al abrir el fichero utilizan y actualizan su posición actual.

Para llevar a cabo el acceso directo, las funciones mencionadas deben combinarse con el FSE, que permite ubicarse en una posición determinada. Los parámetros de la función fseek son el descriptor del fichero (tipo FILE *), el desplazamiento y el modo. Se distinguen tres formas, cada una de ellas eligiendo un punto diferente para aplicar el desplazamiento. Selecciona el inicio del fichero SEEK_SET, la posición actual SEEK_CUR y el final del fichero SEEK_END.

En el Programa 4 se define la función “correctoâ” que lee o escribe un campo de longitud fija que se encuentra en una posición determinada según un parámetro.

También puede ayudar la función ftell, que nos devuelve la posición actual en el acceso directo. Al ver cómo se programa la ayuda de búsqueda que tienen los editores en el programa 5, tenemos un ejemplo de uso de la función ftell.

Programa 4. Uso del acceso directo.
5º programa. Uso de las funciones fseek y ftell.
Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila