[ Foro de C ]

duda de ejercicio en curso: agenda

26-Dec-2009 22:06
e o
5 Respuestas

hola.
en esta ocacion intente realizar algunos de los ejercicios q se presentan en el curso en los q se pide una agenda con manejo de archivos. el primer ejercicio q aparece en el curso con respecto a las agendas (el de la pag 93) lo vi bastante dificil, vi algunas propuestas de solucion en el foro echas por otras personas q ya lo habian resuelto, pero vi q manejan mas bien archivos de texto y no .dat; manejar las fichas con archivos de texto se me izo un poco mas complejo y decidi brincarme ese ejercicio, asta llegar al segundo q aborda a la agenda (uno q esta despues de la explicacion de fwrite y fread y de un ejemplo de copiador de archivos).
realizar el ejercicio se me idealizo de una manera mucho mas facil con fwrite y fread q con el caos q tal vez se haria con fgets y fscanf, sin embargo, a la hora de ejecutar el poco codigo q llevo echo, sale error de ejecucion apenas llega a una instruccion de fwrite o de fread, y no tengo idea de porq sale tal error, asi q pido por favor un poco de ayuda para revisar y corregir el codigo q llevo echo, o talvez dar alguna sugerencia de como abordar el problema si es q estoy totalmente perdido jajaajajaj. aqui esta el codigo q llevo echo hasta ahora:

********************************************************
#include <stdio.h>
#include <string.h>

int main()
{
   struct
   {
       char nombre[51];
       char direccion[51];
       char telefono[21];
       char email[31];
       unsigned int dia;
       unsigned int mes;
       unsigned int anio;
   }fichas[100];
   
   FILE *archivo;
   int i = 0;
   int opcMenu;
   char temporal[51];
   
   
   archivo = fopen("C:\\progs\\archivos\\agenda1.dat", "rb");
   if (archivo != NULL)
   {
       while(!feof(archivo))
       {
           fread(fichas[i].nombre, 1, 51, archivo);
           fread(fichas[i].direccion, 1, 51, archivo);
           fread(fichas[i].telefono, 1, 21, archivo);
           fread(fichas[i].email, 1, 31, archivo);
           fread(&fichas[i].dia, 4, 1, archivo);
           fread(&fichas[i].mes, 4, 1, archivo);
           fread(&fichas[i].anio, 4, 1, archivo);
           i++;
           
       }
   }
   fclose(archivo);
   
   printf("1. agregar ficha\n");
   printf("2. ver todos los nombres\n");
   printf("3. ver todos los datos de 1 nombre\n");
   printf("opcion: ");
   gets(temporal);
   sscanf(temporal, "%d", &opcMenu);
   
   switch(opcMenu)
   {
       case 1:
            if (i < 100)
            {
                i++;
                archivo = fopen("C:\\progs\\archivos\\agenda1.dat", "ab");
                printf("dar nombre: ");
                gets(fichas[i].nombre);
                printf("dar direccion: ");
                gets(fichas[i].direccion);
                printf("dar telefono: ");
                gets(fichas[i].telefono);
                printf("dar email: ");
                gets(fichas[i].email);
                printf("dar dia: ");
                gets(temporal);
                sscanf(temporal, "%u", &fichas[i].dia);
                printf("dar mes: ");
                gets(temporal);
                sscanf(temporal, "%u", &fichas[i].mes);
                printf("dar año: ");
                gets(temporal);
                sscanf(temporal, "%u", &fichas[i].anio);
               
                fwrite(fichas[i].nombre, 1, sizeof(fichas[i].nombre), archivo);
                fwrite(fichas[i].direccion, 1, sizeof(fichas[i].direccion), archivo);
                fwrite(fichas[i].telefono, 1, sizeof(fichas[i].telefono), archivo);
                fwrite(fichas[i].email, 1, sizeof(fichas[i].email), archivo);
                fwrite(&fichas[i].dia, 4, sizeof(fichas[i].dia), archivo);
                fwrite(&fichas[i].mes, 4, sizeof(fichas[i].mes), archivo);
                fwrite(&fichas[i].anio, 4, sizeof(fichas[i].anio), archivo);
               
                printf("ficha agregada\n");
                fclose(archivo);
            }
            else
            {
                printf("ya ay 100 fichas\n");
            }
       break;
   }
}
*********************************************************

ademas, ora ya veo el porq en java y c# se lee con un buffer y se convierte al tipo necesario, se evitan errores q pueden salir al leer directo con scanf y se evita el poner gets y luego convertir con sscanf ajajajajaj.

gracias por la atencion.


31-Dec-2009 18:24
mario moreno

De lo que se trata es de usar fwrite y fread para que pase los datos en bloque, no por campos. Repasate los post, hay uno que habla sobre este ejercicio en concreto, verás cómo utiliza fwrite y fread.

Un saludo


01-Jan-2010 21:26
e o

hola.
muchas gracias por la ayuda y la respuesta. acabo de ver un post de usted mismo con el mismo ejercicio y ya vi como se usan las ordenes de fwrite y fread. intente adaptarlo al codigo q mostre al principio pero el programa me seguia crasheando cada vez q llega a un fwrite o a un fread.
algunas partes que modifique fueron:
*fread(&fichas[i], sizeof(fichas[i]), 1, archivo); al principio con el while pa leer todas las fichas

*fwrite(&fichas[i], sizeof(fichas[i]), 1, archivo); en la opcion 1 del case pa escribir las fichas en el archivo

sin embargo, aun con estas modificaciones seguia crasheando, asta ver la parte en la q se abria el archivo pa lectura casi al principio del programa:
*archivo = fopen("C:\\progs\\archivos\\agenda1.dat", "rb");

el archivo no existia, lo cree y el programa ya funciona. pero ahora me surgio otra duda: en caso de que el archivo no existiera, por eso puse esta parte de codigo:

********************
   if (archivo != NULL)
   {
       while(!feof(archivo))
       {
           fread(&fichas[i], sizeof(fichas[i]), 1, archivo);            
           i++;            
       }
   }
   fclose(archivo);
*********************

aun asi, no entiendo por que crasheaba el programa.
bueno, muchas muchas gracias por su ayuda, y felicidades por estas fiestas!


05-Jan-2010 10:15
emuletas yp

Ahora si que estoy anodadado. :O

Está claro que voy a necesitar un profesor para aprender esto :D


06-Jan-2010 14:43
Nacho Cabanes (+83)

Decías...

----

el archivo no existia, lo cree y el programa ya funciona. pero ahora me surgio otra duda: en caso de que el archivo no existiera, por eso puse esta parte de codigo:

********************
   if (archivo != NULL)
   {
       while(!feof(archivo))
       {
           fread(&fichas[i], sizeof(fichas[i]), 1, archivo);            
           i++;            
       }
   }
   fclose(archivo);
*********************

aun asi, no entiendo por que crasheaba el programa.

---

Ese fragmento puede fallar si el fichero no existe (o no se ha podido abrir correctamente), porque la orden "fclose" está fuera del "if" que comprueba que se ha podido abrir.


07-Jan-2010 22:06
e o

muchas gracias, moviendo el fclose dentro del if ace q ya funcione el programa exista o no el archivo, supongo q no se puede cerrar un archivo q no existe o q no se pudo abrir en 1° lugar.






(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.)