H. FICHEROS





H.0 Puntero a fichero. Apertura y cierre de ficheros

Los ficheros son estructuras de datos almacenadas en memoria secundaria.
Para utilizar la información en memoria principal se emplea fundamentalmente la instrucción de asignación.
El formato de declaración de un fichero es el siguiente:

FILE *nombre.fichero;

En otros lenguajes la declaración del fichero determina el tipo de datos que se van a almacenar en él. En C es distinto, todos los ficheros almacenan bytes y es cuando se realiza la apertura y la escritura cuando se decide cómo y qué se almacena en el mismo; durante la declaración del fichero no se hace ninguna distinción sobre el tipo del mismo.
Antes de usar un fichero es necesario realizar una operación de apertura del mismo; posteriormente, si se desea almacenar datos en él hay que realizar una operación de escritura y si se quiere obtener datos de él es necesario hacer una operación de lectura. Cuando ya no se quiera utilizar el fichero se realiza una operación de cierre del mismo para liberar parte de la memoria principal que pueda estar ocupando (aunque el fichero en sí está almacenado en memoria secundaria, mientras está abierto ocupa también memoria principal).
La instrucción más habitual para abrir un fichero es :

FILE * fichero;
fichero = fopen ( nombre-fichero, modo);

La función fopen devuelve un puntero a un fichero que se asigna a una variable de tipo fichero. Si existe algún tipo de error al realizar la operación, por ejemplo, porque se desee abrir para leerlo y éste no exista, devuelve el valor NULL.
El nombre-fichero será una cadena de caracteres que contenga el nombre (y en su caso la ruta de acceso) del fichero tal y como aparece para el sistema operativo.
El modo es una cadena de caracteres que indica el tipo del fichero (texto o binario) y el uso que se va ha hacer de él lectura, escritura, añadir datos al final, etc. Los modos disponibles son:
· r abre un fichero para lectura. Si el fichero no existe devuelve error.
· w abre un fichero para escritura. Si el fichero no existe se crea, si el fichero existe se destruye y se crea uno nuevo.
· a abre un fichero para añadir datos al final del mismo. Si no existe se crea.
· + símbolo utilizado para abrir el fichero para lectura y escritura.
· b el fichero es de tipo binario.
· t el fichero es de tipo texto.
Si no se pone ni b ni t el fichero es de texto.
Cuando se termine el tratamiento del fichero hay que cerrarlo; si la apertura se hizo con fopen el cierre se hará con:

fclose (fichero);

Para utilizar las instrucciones de manejo de ficheros es necesario incluir la librería
<stdio.h>.


H.1 Lectura y escritura en un fichero


Para almacenar datos en un fichero es necesario realizar una operación de escritura, de igual forma que para obtener datos hay que efectuar una operación de lectura. En C existen muchas y variadas operaciones para leer y escribir en un fichero; entre ellas tenemos:
fread - fwrite, fgetc - fputc, fgets - fputs, fscanf - fprintf.


H.1.1 fread - fwrite

Estas son las dos operaciones que se tienen que usar para leer y escribir en ficheros binarios.
El formato de escritura en bloque es el siguiente:

fwrite (direcc_dato, tamaño_dato, numero_datos, punt_fichero);

Escribe tantos datos como indique numero de datos en el fichero, tomando los datos a partir de la dirección del dato.
Los datos tienen que tener tantos bytes como especifique tamaño. La función fwrite devuelve el número de elementos escritos, este valor debe coincidir con número de datos.
Para calcular el tamaño en bytes de un dato o un tipo de dato se suele utilizar la función:
sizeof (dato); ó sizeof (tipo-de-dato);
La sentencia de lectura de bloque es la siguiente:

fread (direcc_dato, tamaño_dato, numero_datos,punt_fichero);

Lee tantos datos como indique numero de datos del fichero, colocando los datos leídos a partir de la dirección del dato. Los datos tienen que tener tantos bytes como especifique tamaño del dato. La función fread devuelve el número de elementos leídos, y el valor devuelto debe coincidir con número de datos.


H.1.2 fscanf - fprintf

Las instrucciones scanf y printf utilizadas normalmente para lecturas y escrituras de teclado y pantalla tienen sus correspondientes funciones para el manejo de ficheros: fscanf y fprintf. La única diferencia es la necesidad de dar como primer argumento el fichero en el que leemos o escribimos.


H.2 Control

H.2.1 Del cursor

Cuando se lee un dato de un fichero y después el que está a continuación de él, y así sucesivamente, se dice que se está realizando una lectura secuencial del mismo. Cuando podemos acceder a cualquier dato de un fichero sin pasar por anteriores se está realizando un acceso directo a los datos.
La función que permite situarse en un determinado dato del fichero es:

fseek (fichero, posicion, origen);

que coloca el puntero del fichero a tantos bytes del origen como indica posición contando a partir del origen señalado. Los orígenes posibles son:

SEEK_SET: desde el principio del fichero.
SEEK_CUR: desde la posición actual.
SEEK_END: desde el final del fichero.


H.2.2 De errores

Las lecturas y escrituras en un fichero se realizan en la posición en la que se encuentra el puntero del fichero. Al abrir el fichero el puntero está antes del primer dato del mismo. Cada vez que se realiza una operación de lectura o escritura el puntero se mueve hasta apuntar al dato y después lo lee o escribe.
Para controlar la posición del puntero se utiliza la función:

feof(fichero);

que nos devuelve 0 si todavía no hemos llegado a EOF (byte final del fichero) o un número distinto de 0 si llegamos a EOF.

Puedes encontrar ejemplos en la parte práctica de ficheros.