Universidad Carlos III de Madrid

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

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

4. Acceso aleatorio a ficheros

En la sección anterior hemos visto cómo leer y escribir datos de manera secuencial. En algunos casos, sin embargo, se necesita acceder a una parte específica en mitad de un fichero. Para eso contamos con las funciones, fseek, ftell y rewind, que permiten realizar accesos aleatorios.

La función fseek permite desplazar el indicador de posición de fichero al sitio desde donde el cual quieres acceder al fichero. La sintaxis es:

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);

stream es el puntero asociado con el fichero abierto. offset indica el número de bytes que se va a desplazar el indicador desde una posición especificada por whence, que puede tener uno de los siguientes valores: SEEK_SET, SEEK_CUR y SEEK_END. Si todo va bien, la función devuelve 0; si no, devuelve un valor distinto de cero.

Si se utiliza SEEK_SET, el desplazamiento se realizará desde el principio del fichero, y el tamaño de offset deberá ser mayor o igual que cero. Si se usa SEEK_END, el desplazamiento se realizará desde el final del fichero, y el valor de offset tendrá que ser negativo. Si se usa SEEK_CUR, el desplazamiento se calcula desde la posición actual del indicador de posición de fichero.

Puedes obtener el valor actual del indicador de posición de fichero llamando a ftell:

#include <stdio.h>
int ftell(FILE *stream);

El valor que devuelve ftell representa el número de bytes desde el principio del fichero hasta donde nos encontramos en ese momento (sitio indicado por el indicador de posición). Si la función falla, devuelve -1L (es decir, el valor largo (long) de menos 1).

A veces te interesará reiniciar el indicador de posición de fichero y llevarlo al inicio del mismo. Para esto cuentas con la función rewind:

#include <stdio.h>
void rewind(FILE *stream);

De esta manera, la siguiente línea de código:

rewind(ptr_fich);

es equivalente a esta otra:

fseek(ptr_fich,0L,SEEK_SET);