Page 356

5.3 Ficheros binarios La funci´ on devuelve el valor 0 si tiene ´exito, y un valor no nulo en caso contrario. Has de tener siempre presente que los desplazamientos sobre el fichero se indican en bytes. Si hemos almacenado enteros de tipo int en un fichero binario, deberemos tener la precauci´on de que todos nuestros fseek tengan desplazamientos m´ ultiplos de sizeof (int). Este programa, por ejemplo, pone a cero todos los valores pares de un fichero binario de enteros: anula pares.c 1

anula pares.c

#include <stdio.h>

2 3 4 5 6

int main(void) { FILE * fp; int n, bytes_leidos, cero = 0;

7

fp = fopen("fichero.dat", "r+b"); while (fread (&n, sizeof (int), 1, fp) != 0) { if (n % 2 == 0) { // Si el u ´ltimo valor le´ıdo es par... fseek (fp, -sizeof (int), SEEK_CUR); // ... damos un paso atr´ as ... fwrite(&cero, sizeof (int), 1, fp); // ... y sobreescribimos su valor absoluto. } } fclose(fp);

8 9 10 11 12 13 14 15 16

return 0;

17 18

}

La segunda funci´ on que te presentamos en este apartado es ftell . Este es su prototipo: int ftell (FILE *fp);

El valor devuelto por la funci´ on es la posici´on en la que se encuentra el ((cabezal)) de lectura/escritura en el instante de la llamada. Veamos un ejemplo. Este programa, por ejemplo, crea un fichero y nos dice el n´ umero de bytes del fichero: cuenta bytes.c 1

cuenta bytes.c

#include <stdio.h>

2 3 4 5 6

int main(void) { FILE * fp; int i, pos;

7

fp = fopen("prueba.dat", "wb"); for (i=0; i<10; i++) fwrite(&i, sizeof (int), 1, fp); fclose(fp);

8 9 10 11 12

fp = fopen("prueba.dat", "rb"); fseek (fp, 0, SEEK_END); pos = ftell (fp); printf ("Tama~ no del fichero: %d\n", pos); fclose(fp);

13 14 15 16 17 18

return 0;

19 20

}

F´ıjate bien en el truco que permite conocer el tama˜ no de un fichero: nos situamos al final del fichero con ftell indicando que queremos ir al ((primer byte desde el final)) (byte 0 con el modo SEEK_END) y averiguamos a continuaci´on la posici´on en la que nos encontramos (valor devuelto por ftell ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 330 Dise˜ na una funci´ on de nombre rebobina que recibe un FILE * y nos ubica al inicio del mismo. 350

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement