Problema en agenda con ficheros

Iniciado por DickGumshoe, 7 Febrero 2012, 23:05 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

Este es el código que me ha quedado al hacer el programa:

/*  Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día,
    mes y año de nacimiento (estos tres últimos datos deberán ser números enteros
    cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato
    nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una
    persona (se preguntará al usuario cual es el nombre de esa persona que quiere
    visualizar). Al empezar el programa, leerá los datos de un fichero llamado "agenda.dat"
    (si existe). Al terminar, guardará todos los datos en ese fichero. */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        struct
        {
          char nombre[10];
          char direccion[15];
          int movil;
          char email[20];
           int dia, mes, ano;
        }datos[100];
        char lineas[500],comprobar[10];
        FILE* fichero;
        int opcion,posicion,tamano,i=0,j,aux;
       int c;
        fichero = fopen("agenda.dat", "r+b");
        if(fichero != NULL)
        {
       
        while(!feof(fichero)) //Leemos los datos que contiene el archivo y los almacenamos en datos[100]
        {
          c=fscanf(fichero,"%s",datos[i].nombre);
          fscanf(fichero,"%s",datos[i].direccion);
          fscanf(fichero,"%d",&datos[i].movil);
          fscanf(fichero,"%s",datos[i].email);
          fscanf(fichero,"%d",&datos[i].dia);
          fscanf(fichero,"%d",&datos[i].mes);
          fscanf(fichero,"%d",&datos[i].ano);
          if(c!=-1)i++; // evita incrementar erroneamente
        }

       
       rewind(fichero);
     
        do
        {
        do
        {
        printf("Fichas guardadas: %i\n",i);
        printf("Elija una opcion\n");
        printf("1. Introducir datos\n");
        printf("2. Visualizar nombres de las fichas existentes\n");
        printf("3. Mostrar todos los datos de una persona\n");
        printf("4. Salir\n");
        scanf("%d",&opcion);
        getchar();
       
        switch(opcion)
        {
          case 1:
               printf("Introduce un nombre: ");
               scanf("%s",datos[i].nombre);
             
               printf("Introduce una direccion: ");
             
               scanf("%s",datos[i].direccion);
               printf("Introduce un movil: ");
               scanf("%d",&datos[i].movil);
               while(getchar() != '\n');
               printf("Introduce correo electronico: ");
             
               scanf("%s",datos[i].email);
               printf("Introduce dia de nacimiento: ");
               scanf("%d",&datos[i].dia);
               while(getchar() != '\n');
               printf("Introduce mes de nacimiento: ");
               scanf("%d",&datos[i].mes);
               while(getchar() != '\n');
               printf("Introduce ano de nacimiento: ");
               scanf("%d",&datos[i].ano);
               i++;
               break;
          case 2:
               for(j=0;j<i;j++)
               {
                 printf("%s\n",datos[j].nombre);
               }
                 
                 
               break;
          case 3:
              printf("Introduce el nombre de la persona de la que desea visualizar los datos:");
             scanf("%s",comprobar);
              for(j=0;j<i;j++)
              {
                if(strcmp(datos[j].nombre,comprobar)==0)
                {
                  printf("Nombre: %s\n",datos[j].nombre);
                  printf("Direccion: %s\n",datos[j].direccion);
                  printf("Movil: %d\n",datos[j].movil);
                  printf("Email: %s\n",datos[j].email);
                  printf("Dia de nacimiento: %d\n",datos[j].dia);
                  printf("Mes de nacimiento: %d\n",datos[j].mes);
                  printf("Ano de nacimiento: %d\n",datos[j].ano);
                }
              }
               break;
          case 4:
               break;
          default:
                  printf("Opcion no valida!\n");
        }
       
        }while(opcion<1||opcion>4);
       
        }while(opcion!=4);
        }
        aux=i;
        for(i=0;i<aux;i++)
        {
          fprintf(fichero, "%s\n", datos[i].nombre);
          fprintf(fichero, "%s\n", datos[i].direccion);
          fprintf(fichero, "%d\n", datos[i].movil);
          fprintf(fichero, "%s\n", datos[i].email);
          fprintf(fichero, "%d\n", datos[i].dia);
          fprintf(fichero, "%d\n", datos[i].mes);
          fprintf(fichero, "%d\n", datos[i].ano);
          }
       fclose(fichero);
       
        printf("\n\nPulse una tecla para continuar");
        getchar();
        return 0;
    }


Saludos.

s00rk

Cita de: DickGumshoe en 11 Febrero 2012, 21:27 PM
Este es el código que me ha quedado al hacer el programa:

/*  Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día,
    mes y año de nacimiento (estos tres últimos datos deberán ser números enteros
    cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato
    nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una
    persona (se preguntará al usuario cual es el nombre de esa persona que quiere
    visualizar). Al empezar el programa, leerá los datos de un fichero llamado "agenda.dat"
    (si existe). Al terminar, guardará todos los datos en ese fichero. */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        struct
        {
          char nombre[10];
          char direccion[15];
          int movil;
          char email[20];
           int dia, mes, ano;
        }datos[100];
        char lineas[500],comprobar[10];
        FILE* fichero;
        int opcion,posicion,tamano,i=0,j,aux;
       int c;
        fichero = fopen("agenda.dat", "r+b");
        if(fichero != NULL)
        {
       
        while(!feof(fichero)) //Leemos los datos que contiene el archivo y los almacenamos en datos[100]
        {
          c=fscanf(fichero,"%s",datos[i].nombre);
          fscanf(fichero,"%s",datos[i].direccion);
          fscanf(fichero,"%d",&datos[i].movil);
          fscanf(fichero,"%s",datos[i].email);
          fscanf(fichero,"%d",&datos[i].dia);
          fscanf(fichero,"%d",&datos[i].mes);
          fscanf(fichero,"%d",&datos[i].ano);
          if(c!=-1)i++; // evita incrementar erroneamente
        }

       
       rewind(fichero);
     
        do
        {
        do
        {
        printf("Fichas guardadas: %i\n",i);
        printf("Elija una opcion\n");
        printf("1. Introducir datos\n");
        printf("2. Visualizar nombres de las fichas existentes\n");
        printf("3. Mostrar todos los datos de una persona\n");
        printf("4. Salir\n");
        scanf("%d",&opcion);
        getchar();
       
        switch(opcion)
        {
          case 1:
               printf("Introduce un nombre: ");
               scanf("%s",datos[i].nombre);
             
               printf("Introduce una direccion: ");
             
               scanf("%s",datos[i].direccion);
               printf("Introduce un movil: ");
               scanf("%d",&datos[i].movil);
               while(getchar() != '\n');
               printf("Introduce correo electronico: ");
             
               scanf("%s",datos[i].email);
               printf("Introduce dia de nacimiento: ");
               scanf("%d",&datos[i].dia);
               while(getchar() != '\n');
               printf("Introduce mes de nacimiento: ");
               scanf("%d",&datos[i].mes);
               while(getchar() != '\n');
               printf("Introduce ano de nacimiento: ");
               scanf("%d",&datos[i].ano);
               i++;
               break;
          case 2:
               for(j=0;j<i;j++)
               {
                 printf("%s\n",datos[j].nombre);
               }
                 
                 
               break;
          case 3:
              printf("Introduce el nombre de la persona de la que desea visualizar los datos:");
             scanf("%s",comprobar);
              for(j=0;j<i;j++)
              {
                if(strcmp(datos[j].nombre,comprobar)==0)
                {
                  printf("Nombre: %s\n",datos[j].nombre);
                  printf("Direccion: %s\n",datos[j].direccion);
                  printf("Movil: %d\n",datos[j].movil);
                  printf("Email: %s\n",datos[j].email);
                  printf("Dia de nacimiento: %d\n",datos[j].dia);
                  printf("Mes de nacimiento: %d\n",datos[j].mes);
                  printf("Ano de nacimiento: %d\n",datos[j].ano);
                }
              }
               break;
          case 4:
               break;
          default:
                  printf("Opcion no valida!\n");
        }
       
        }while(opcion<1||opcion>4);
       
        }while(opcion!=4);
        }
        aux=i;
        for(i=0;i<aux;i++)
        {
          fprintf(fichero, "%s\n", datos[i].nombre);
          fprintf(fichero, "%s\n", datos[i].direccion);
          fprintf(fichero, "%d\n", datos[i].movil);
          fprintf(fichero, "%s\n", datos[i].email);
          fprintf(fichero, "%d\n", datos[i].dia);
          fprintf(fichero, "%d\n", datos[i].mes);
          fprintf(fichero, "%d\n", datos[i].ano);
          }
       fclose(fichero);
       
        printf("\n\nPulse una tecla para continuar");
        getchar();
        return 0;
    }


Saludos.

o.O
Exelente, solamente lo que yo talvez agregaria es que a la hora de Agregar un nuevo dato, seria comprobar que no haya mas de 100 datos ya dentro, porque si ya hay 100 e intentas agregar uno nuevo pues dara error, creo que seria lo unico que yo le agregaria.

DickGumshoe

¡Muchas gracias! Se me olvidó poner eso. Ya lo he añadido.

Saludos.

BlackZeroX

#23
Un consejo cuando sean registros estructurados es mejor usar una BDD en este caso te recomiendo que uses SQLite, asi tus consultas son mas rápidas y no te complicas tanto con códigos largos y complejos y en si el desarrollo de tu aplicación sera mas rápido y simple.

http://www.sqlite.org/

Dulces Lunas!¡.
The Dark Shadow is my passion.

DickGumshoe

Gracias por la recomendación.

He estado mirando la página que me has pasado y otras que he encontrado por Internet, y parece muy buena la librería. Todavía no he empezado a usar librerías no incluidas en el compilador, pero cuando termine de leer el manual que estoy siguiendo y de hacer los ejercicios que vienen en él, empezaré a usar librerías que no vienen en el compilador (entre ellas esta que me has pasado).

Saludos y gracias.