Page 357

5 Ficheros

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

· 331 Dise˜ na una funci´ on que reciba un FILE * (ya abierto) y nos diga el n´ umero de bytes que ocupa. Al final, la funci´ on debe dejar el cursor de lectura/escritura en el mismo lugar en el que estaba cuando se la llam´ o. · 332 Dise˜ na un programa que calcule y muestre por pantalla el m´aximo y el m´ınimo de los valores de un fichero binario de enteros. · 333 Dise˜ na un programa que calcule el m´aximo de los enteros de un fichero binario y lo intercambie por el que ocupa la u ´ltima posici´on. · 334 Nos pasan un fichero binario dobles.dat con una cantidad indeterminada de n´ umeros de tipo float. Sabemos, eso s´ı, que los n´ umeros est´an ordenados de menor a mayor. Dise˜ na un programa que pida al usuario un n´ umero y determine si est´a o no est´a en el fichero. En una primera versi´ on, implementa una b´ usqueda secuencial que se detenga tan pronto est´es seguro de que el n´ umero buscado est´a o no. El programa, en su versi´on final, deber´a efectuar la b´ usqueda dicot´ omicamente (en un cap´ıtulo anterior se ha explicado qu´e es una b´ usqueda dicot´ omica). ............................................................................................. Trabajar con ficheros binarios como si se tratara de vectores tiene ciertas ventajas, pero tambi´en inconvenientes. La ventaja m´ as obvia es la capacidad de trabajar con cantidades ingentes de datos sin tener que cargarlas completamente en memoria. El inconveniente m´as serio es la enorme lentitud con que se pueden ejecutar entonces los programas. Ten en cuenta que desplazarse por un fichero con fseek obliga a ubicar el ((cabezal)) de lectura/escritura del disco duro, una operaci´ on que es intr´ınsecamente lenta por comportar operaciones mec´anicas, y no s´olo electr´ onicas. Si en un fichero binario mezclas valores de varios tipos resultar´a dif´ıcil, cuando no imposible, utilizar sensatamente la funci´ on fseek para posicionarse en un punto arbitrario del fichero. Tenemos un problema similar cuando la informaci´on que guardamos en un fichero es de longitud intr´ınsecamente variable. Pongamos por caso que usamos un fichero binario para almacenar una lista de palabras. Cada palabra es de una longitud, as´ı que no hay forma de saber a priori en qu´e byte del fichero empieza la n-´esima palabra de la lista. Un truco consiste en guardar cada palabra ocupando tanto espacio como la palabra m´as larga. Este programa, por ejemplo, pide palabras al usuario y las escribe en un fichero binario en el que todas las cadenas miden exactamente lo mismo (aunque la longitud de cada una de ellas sea diferente): guarda palabras.c

guarda palabras.c 1

#include <stdio.h>

2 3

#define MAXLON 80

4 5 6 7 8

int main(void) { char palabra[MAXLON+1], seguir [MAXLON+1]; FILE * fp;

9

fp = fopen("diccio.dat", "wb"); do { printf ("Dame una palabra: "); gets(palabra); fwrite(palabra, sizeof (char), MAXLON, fp); printf ("Pulsa ’s’ para a~ nadir otra."); gets(seguir ); } while (strcmp(seguir , "s") == 0); fclose(fp);

10 11 12 13 14 15 16 17

return 0;

18 19

}

F´ıjate en que cada palabra ocupa siempre lo mismo, independientemente de su longitud: 80 bytes. Este otro programa es capaz ahora de mostrar la lista de palabras en orden inverso, gracias a la ocupaci´ on fija de cada palabra: lee palabras orden inverso.c 1

lee palabras orden inverso.c

#include <stdio.h>

2 3

#define MAXLON 80

Introducci´ on a la Programaci´ on con C

351

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement