[ Foro de C ]

Duda ejercicio agenda con fwrite/fread

27-Oct-2009 19:55
mario moreno
4 Respuestas

Bueno, pues yo no he tardado mucho en dudar :). La duda es la siguiente:

Si en la antigua agenda nos basábamos en un struct de 100 fichas tal como este por ejemplo:

struct
       {
           char nombre [LONG + 1];
           char direccion [LONG + 1];
           char tfnomovil[LONG + 1];
           char mail[LONG + 1];
           int dia, mes, anyonacimiento;
       }agenda[100];

Para hacer la nueva agenda mejorada, ¿podemos seguir manteniendo este struct de 100 fichas? o lo debemos limitar a un sólo registro tal que así:

struct
       {
           char nombre [LONG + 1];
           char direccion [LONG + 1];
           char tfnomovil[LONG + 1];
           char mail[LONG + 1];
           int dia, mes, anyonacimiento;
       }agenda;

Lo digo porque he estado buscando información sobre el uso de fwrite y he visto algún ejemplo que hace referencia precisamente a una agenda como ejemplo. Y he observado que el struct que usa es simple (o sea, sin [100]).

Lo comento también porque en los intentos que he estado haciendo me he visto con el problema de que por ejemplo si creo un registro nuevo, me lo guarda en el fichero "agenda.txt" como era de esperar. Pero cuando vuelvo a crear otro registro me vuelve a guardar el registro anterior. O sea, los datos que hay en "agenda[0].nombre" y los que hay en "agenda[1].nombre.

Si ahora crease un tercero, me volvería a guardar los 2 anteriores más "agenda[2].nombre. No se si me he explicado con claridad.


30-Oct-2009 23:57
Roberto rrs

Hola Mario.
A mi me pasaba lo mismo que a ti y he conseguido resolverlo de esta manera, te lo pongo por si te sirve:

(Esta es la forma de leer del fichero)

FILE* fichero;
fichero=fopen(agenda, "r+b");
while (!feof(fichero))
{fread(&fichas[a], sizeof(fichas[a]) , 1, fichero);
a++;}


(Esta es la forma de guardar datos en el fichero)

case 1: /*Introducir nueva ficha*/
              do {          
              printf ("Introduce nueva ficha:\n\n");
              printf ("Introduce nombre: ");
              gets (fichas[a].nombre);
              if (strlen(fichas[a].nombre)==0) break;
             
              printf ("Introduce direccion: ");
              gets (fichas[a].direccion);
             
              printf ("Introduce movil: ");
              gets (fichas[a].movil);
             
              printf ("Introduce dia: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%2u", &fichas[a].dia);
             
              printf ("Introduce mes: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%2u", &fichas[a].mes);
             
              printf ("Introduce anyo: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%4u", &fichas[a].anyo);
              fwrite(&fichas[a], sizeof(fichas[a]) , 1, fichero);


01-Nov-2009 21:44
Nacho Cabanes (+31)

La forma de Roberto es buena, pero en un fichero binario, si lo que guardas son "struct" de tamaño fijo, no es necesario leer todos los datos y guardar todos en memoria, sino sólo un dato, porque con "fseek" puedes posicionarte rápidamente y leer el dato que te interesa.

Así las búsquedas son más lentas, pero la cantidad de información a manejar no está limitada por la memoria (RAM) libre, sino por el espacio de almacenamiento que tengas.


02-Nov-2009 08:14
Roberto rrs

Hola Nacho.
Aporte esa solución para el problema que usa fread, fwrite y sizeof.
Ahora estoy en el problema de mejorar la agenda con fseek.
Saludos.


02-Nov-2009 21:46
Jess S.

¡Hola!

Mario, yo he dejado la estructura y el fichero tal como estaban en el archivo de texto.

Sólo he llegado a preparar el fichero y poder ir añadiendo fichas, pero funciona.

Verás todos los nombres en diminutivo. Es para distinguirlos del fichero de texto. Te lo comento para que no te de la risa.

Adjunto lo que he hecho, por si te sirve.

Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)