UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

Capítulo 9. Lectura y escritura de ficheros

9.1. Introducción

C ofrece un conjunto de funciones para realizar operaciones de entrada y salida (E/S) con las cuales puedes leer y escribir cualquier tipo de fichero. Antes de ver estas funciones, hay que entender algunos conceptos básicos.

9.1.1. Qué es un fichero

En C, un fichero se puede referir a un fichero en disco, a un terminal, a una impresora, etc. Dicho de otro modo, un fichero representa un dispositivo concreto con el que puedes intercambiar información. Antes de poder trabajar con un fichero, tienes que abrir ese fichero. Tras terminar el intercambio de información, debes cerrar el fichero que abriste.

9.1.2. Qué es un flujo o stream

El conjunto datos que transfieres desde un programa a un fichero, o al revés, se le conoce como flujo (stream en inglés), y consiste en una serie de bytes (o caracteres). A diferencia de un fichero, que se refiere a un dispositivo concreto de E/S, un flujo es independiente del dispositivo. Es decir, todos los flujos tienen el mismo comportamiento independientemente del dispositivo al que esté asociado. De esta manera puedes realizar operaciones E/S con tan sólo asociar un flujo a un fichero.

Hay dos tipos de flujos. Uno es el flujo de texto, consistente en líneas de texto. Una línea es una secuencia de caracteres terminada en el carácter de línea nueva ('\n' ó '\r\n'). El otro formato es el del flujo binario, que consiste en una secuencia de bytes que representan datos internos como números, estructuras o arrays. Se utiliza principalmente para datos que no son de tipo texto, donde no importa la apariencia de esos datos en el fichero (da igual que no se vean "en bonito", como podría verse en un fichero de texto).

9.1.3. E/S mediante buffers

Una porción de memoria que se usa temporalmente para almacenar datos antes de ser enviados a su destino se llama buffer. Con ayuda de los buffers, el sistema operativo puede mejorar su eficiencia reduciendo el número de accesos a efectuar en un dispositivo de E/S (es decir, en un fichero).

El acceso a disco o a otros dispositivos de E/S suele ser más lento que a memoria de acceso directo; por eso, si varias operaciones E/S se realizan en un buffer en vez de en el fichero en sí, el funcionamiento de un programa es más eficiente. Por ejemplo, si se envían varias operaciones de escritura a un buffer, las modificaciones de esos datos escritos se quedan en memoria hasta que es hora de guardarlas, que es cuando esos datos se llevan al dispositivo real (a este proceso se le conoce como flushing).

Por defecto, todas las operaciones de los flujos E/S en C son con buffer.

9.1.4. Comportamiento del modelo E/S

Ya que la unidad más pequeña que se puede representar en C es un caracter, se puede acceder a un fichero desde cualquiera de sus caracteres (o bytes, que es lo mismo). Se puede leer o escribir cualquier número de caracteres desde un punto móvil, conocido como el indicador de posición de fichero. Los caracteres se leen o escriben en secuencia desde ese punto, y el indicador se va moviendo de acuerdo a eso. El indicador se coloca al principio del fichero cuando éste se abre, pero luego se puede mover a cualquier punto explícitamente (no sólo porque se haya leído o escrito algo).