Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 28 Octubre 2013, 23:10 pm



Título: agenda y archivos
Publicado por: m@o_614 en 28 Octubre 2013, 23:10 pm
Saludos, tengo que crear un programa que me cree Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día, mes y año de nacimiento, Se podra añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar los datos

pero hay una parte que dice: leerá los datos de un fichero llamado “agenda.dat” (si existe). Al terminar, guardará todos los datos en ese fichero. y es lo que no entiendo bien que quiere decir, como voy a leer datos de un fichero si me esta diciendo que guarde todos los datos en el fichero al final y en la parte que dice añadir un dato nuevo, se refiere a agregar una Persona a la agenda con su nombre,direccion,tel... o a inventar un nuevo dato como edad o algo asi??

Código
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #define AGREGAR 1
  4. #define VISUALIZAR 2
  5. #define MOSTRAR 3
  6. #define SALIR 4
  7. #define TAM 3
  8. #define MAX 45
  9. typedef struct datos
  10. {
  11.    char nombre[MAX];
  12.    char direccion[MAX];
  13.    char tlf_movil[MAX];
  14.    char email[MAX];/*
  15.     Fecha fechaNacimiento;*/
  16. }Agenda;
  17.  
  18. void agregar_Persona(Agenda persona[],int i);
  19. void visualizar_Nombres(Agenda persona[],int i);
  20. void mostrar_datos(char nombreBuscar[],Agenda persona[],int i);
  21.  
  22. int main()
  23. {
  24.    int i = 0,continuar = 1,opcion;
  25.    char nombreBuscar[MAX],op[TAM];
  26.    FILE *fd;
  27.    Agenda persona[TAM];/*
  28.     if((fd = fopen("F:\\agenda.dat","w"))!= NULL)
  29.     {*/
  30.        do
  31.        {
  32.            printf("Menu\n");
  33.            printf("1)Agregar Registro\n");
  34.            printf("2)Visualizar Nombres\n");
  35.            printf("3)Mostrar datos\n");
  36.            printf("4)Salir\n");
  37.            fgets(op,TAM,stdin);
  38.            sscanf(op,"%d",&opcion);
  39.            switch(opcion)
  40.            {
  41.                case AGREGAR:
  42.                   if(i < TAM)
  43.                   {
  44.                       agregar_Persona(persona,i);
  45.                       i++;
  46.                   }
  47.                   else
  48.                      printf("No se permiten agregar mas de 100 registros");
  49.                   break;
  50.                case VISUALIZAR:
  51.                   visualizar_Nombres(persona,i);
  52.                   break;
  53.                case MOSTRAR:
  54.                   printf("Dame el nombre de la persona a mostrar: ");
  55.                   fgets(nombreBuscar,MAX,stdin);
  56.                   mostrar_datos(nombreBuscar,persona,i);
  57.                   break;
  58.                case SALIR:
  59.                   continuar = 0;
  60.                   break;
  61.                default : printf("Opcion invalida!");
  62.            }
  63.            if(continuar)
  64.            {
  65.                system("pause");
  66.                system("cls");
  67.            }
  68.        }while(continuar);
  69. /*
  70.     }*/
  71.    return 0;
  72. }
  73.  
  74. void agregar_Persona(Agenda persona[],int i)
  75. {
  76.    char cadena[MAX];
  77.    printf("Dame nombre:\n");
  78.    fgets(persona[i].nombre,MAX,stdin);
  79.    printf("Dame direccion:\n");
  80.    fgets(persona[i].direccion,MAX,stdin);
  81.    printf("Dame telefono movil:\n");
  82.    fgets(persona[i].tlf_movil,MAX,stdin);
  83.    printf("Dame email:\n");
  84.    fgets(persona[i].email,MAX,stdin);
  85.    system("cls");
  86. }
  87.  
  88. void visualizar_Nombres(Agenda persona[],int i)
  89. {
  90.    int j;
  91.    for(j = 0;j < i;j++)
  92.       printf("%s\n",persona[j].nombre);
  93. }
  94.  
  95. void mostrar_datos(char nombreBuscar[],Agenda persona[],int i)
  96. {
  97.    int j;
  98.    for(j = 0;j < i;j++)
  99.    {
  100.        if((strcmp(nombreBuscar,persona[j].nombre))== NULL)
  101.        {
  102.            printf("%s\n",persona[j].nombre);
  103.            printf("%s\n",persona[j].direccion);
  104.            printf("%s\n",persona[j].tlf_movil);
  105.            printf("%s\n",persona[j].email);
  106.        }
  107.    }
  108. }
  109.  


Título: Re: agenda y archivos
Publicado por: rir3760 en 29 Octubre 2013, 02:06 am
hay una parte que dice: leerá los datos de un fichero llamado “agenda.dat” (si existe). Al terminar, guardará todos los datos en ese fichero. y es lo que no entiendo bien que quiere decir, como voy a leer datos de un fichero si me esta diciendo que guarde todos los datos en el fichero al final
Son tres pasos:
1) Abres el archivo en modo lectura y lees todos los registros almacenándolos en el array.
2) Todas las operaciones (listado parcial y total, agregar) se realizan en el array.
3) Justo antes de terminar el programa abres el archivo en modo escritura y sobrescribes su contenido con los registros en el array.

y en la parte que dice añadir un dato nuevo, se refiere a agregar una Persona a la agenda con su nombre,direccion,tel... o a inventar un nuevo dato como edad o algo asi?
Desde el menú la opción agregar debe permitir al usuario agregar un registro.

Un saludo


Título: Re: agenda y archivos
Publicado por: m@o_614 en 29 Octubre 2013, 02:22 am
gracias rir3760 por tu respuesta, despues del ciclo do while cerre el archivo fd y volvi a abrir el mismo archivo pero ahora en modo escritura para poder escribir en el, la unica duda que me queda es por que en esta linea me aparece un warning de comparison between integer and pointer without a cast y que aun asi me compile:

la linea es esta:
Código
  1. if((strcmp(nombreBuscar,persona[j].nombre))== NULL)

y el codigo
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define AGREGAR 1
  5. #define VISUALIZAR 2
  6. #define MOSTRAR 3
  7. #define SALIR 4
  8. #define TAM 3
  9. #define MAX 45
  10. /*
  11.    Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día, mes y año de nacimiento,
  12.    (estos tres últimos datos deberán ser números enteros cortos). Deberá tener capacidad para 100 fichas.
  13.    Se podra añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar los datos de una persona
  14.    (se preguntará al usuario cual es el nombre de esa persona que quiere visualizar). Al empezar el programa,
  15.    leerá los datos de un fichero llamado “agenda.dat” (si existe). Al terminar, guardará todos los datos en ese fichero.
  16. */
  17. typedef struct datos
  18. {
  19.    char nombre[MAX];
  20.    char direccion[MAX];
  21.    char tlf_movil[MAX];
  22.    char email[MAX];
  23. }Agenda;
  24.  
  25. void agregar_Persona(Agenda persona[],int i);
  26. void visualizar_Nombres(Agenda persona[],int i);
  27. void mostrar_datos(char nombreBuscar[],Agenda persona[],int i);
  28.  
  29. int main()
  30. {
  31.    int i = 0,continuar = 1,opcion;
  32.    char nombreBuscar[MAX],op[TAM];
  33.    FILE *fd,*ap;
  34.    Agenda persona[TAM];
  35.    if((fd = fopen("F:\\agenda.dat","r"))!= NULL)
  36.    {
  37.        do
  38.        {
  39.            printf("Menu\n");
  40.            printf("1)Agregar Registro\n");
  41.            printf("2)Visualizar Nombres\n");
  42.            printf("3)Mostrar datos\n");
  43.            printf("4)Salir\n");
  44.            fgets(op,TAM,stdin);
  45.            sscanf(op,"%d",&opcion);
  46.            switch(opcion)
  47.            {
  48.                case AGREGAR:
  49.                   if(i < TAM)
  50.                   {
  51.                       agregar_Persona(persona,i);
  52.                       i++;
  53.                   }
  54.                   else
  55.                      printf("No se permiten agregar mas de 100 registros");
  56.                   break;
  57.                case VISUALIZAR:
  58.                   visualizar_Nombres(persona,i);
  59.                   break;
  60.                case MOSTRAR:
  61.                   printf("Dame el nombre de la persona a mostrar: ");
  62.                   fgets(nombreBuscar,MAX,stdin);
  63.                   mostrar_datos(nombreBuscar,persona,i);
  64.                   break;
  65.                case SALIR:
  66.                   continuar = 0;
  67.                   break;
  68.                default : printf("Opcion invalida!");
  69.            }
  70.            if(continuar)
  71.            {
  72.                system("pause");
  73.                system("cls");
  74.            }
  75.        }while(continuar);
  76.    }
  77.    fclose(fd);
  78.    if((ap = fopen("F:\\agenda.dat","w"))!= NULL)
  79.       fwrite(persona,TAM,sizeof(char),ap);
  80.    return 0;
  81. }
  82.  
  83. void agregar_Persona(Agenda persona[],int i)
  84. {
  85.    char cadena[MAX];
  86.    printf("Dame nombre:\n");
  87.    fgets(persona[i].nombre,MAX,stdin);
  88.    printf("Dame direccion:\n");
  89.    fgets(persona[i].direccion,MAX,stdin);
  90.    printf("Dame telefono movil:\n");
  91.    fgets(persona[i].tlf_movil,MAX,stdin);
  92.    printf("Dame email:\n");
  93.    fgets(persona[i].email,MAX,stdin);
  94. }
  95.  
  96. void visualizar_Nombres(Agenda persona[],int i)
  97. {
  98.    int j;
  99.    for(j = 0;j < i;j++)
  100.       printf("%s\n",persona[j].nombre);
  101. }
  102.  
  103. void mostrar_datos(char nombreBuscar[],Agenda persona[],int i)
  104. {
  105.    int j,encontrado = 0;
  106.    for(j = 0;((j < i)&&(!encontrado));j++)
  107.    {
  108.        if((strcmp(nombreBuscar,persona[j].nombre))== NULL)//aqui me aparece un warning
  109.        {
  110.            printf("%s\n",persona[j].nombre);
  111.            printf("%s\n",persona[j].direccion);
  112.            printf("%s\n",persona[j].tlf_movil);
  113.            printf("%s\n",persona[j].email);
  114.            encontrado = 1;
  115.        }
  116.    }
  117. }
  118.  


Título: Re: agenda y archivos
Publicado por: rir3760 en 29 Octubre 2013, 02:55 am
por que en esta linea me aparece un warning de comparison between integer and pointer without a cast y que aun asi me compile:

la linea es esta:
Código
  1. if((strcmp(nombreBuscar,persona[j].nombre))== NULL)
Porque estas comparando el valor de retorno de strcmp (de tipo signed int) con la macro NULL (usualmente "(void *) 0"). Debes cambiar la comparación a:
Código
  1. if (strcmp(nombreBuscar, persona[j].nombre) == 0)

Un saludo


Título: Re: agenda y archivos
Publicado por: m@o_614 en 29 Octubre 2013, 21:22 pm
rir3760 pero si NULL retorna un puntero tipo void, que no se supone que void puede apuntar a cualquier tipo de dato??? y una cosa mas si en la estructura typedef tengo el campo fecha de nacimiento de esta manera:

Código
  1. ypedef struct
  2. {
  3.    int dia;
  4.    int mes;
  5.    int año;
  6. }Fecha;
  7.  
  8. typedef struct datos
  9. {
  10.    char nombre[MAX];
  11.    char direccion[MAX];
  12.    char tlf_movil[MAX];
  13.    char email[MAX];
  14.    Fecha fechaNacimiento;
  15. }Agenda;

y despues quiero agregarle la fecha de nacimiento usando el fgets y el sscanf podria ser de esta manera??
Código
  1. void agregar_Persona(Agenda persona[],int i)
  2. {
  3.    char cadena[MAX];
  4.    printf("Dame nombre:\n");
  5.    fgets(persona[i].nombre,MAX,stdin);
  6.    printf("Dame direccion:\n");
  7.    fgets(persona[i].direccion,MAX,stdin);
  8.    printf("Dame telefono movil:\n");
  9.    fgets(persona[i].tlf_movil,MAX,stdin);
  10.    printf("Dame email:\n");
  11.    fgets(persona[i].email,MAX,stdin);
  12.    printf("Dame fecha de nacimiento:\n");
  13.    fgets(cadena,MAX,stdin);
  14.    sscanf(cadena,"%d",&datos[i].fechaNacimiento.dia);
  15.    sscanf(cadena,"%d",&datos[i].fechaNacimiento.mes);
  16.    sscanf(cadena,"%d",&datos[i].fechaNacimiento.año);
  17. }
  18.  
con un solo arreglo cadena para almacenar dia mes y año aunque sean campos diferentes

gracias


Título: Re: agenda y archivos
Publicado por: rir3760 en 30 Octubre 2013, 16:00 pm
si NULL retorna un puntero tipo void, que no se supone que void puede apuntar a cualquier tipo de dato?
Cierto pero ese tema no tiene relación alguna con el tuyo. Lo que tu intentas es comparar el valor de retorno de la función strcmp que es de tipo int con una dirección de memoria y eso no es valido en C, de ahí el mensaje de advertencia del compilador. La solución ya la mencione en mi mensaje anterior.

En cuanto a pedir la fecha debes obtener los tres valores en la misma llamada a sscanf, de esta forma (el nombre del array debe ser "persona"):
Código
  1. puts("Dame fecha de nacimiento:");
  2. fgets(cadena, MAX, stdin);
  3.   cadena, "%d %d %d",
  4.   &datos[i].fechaNacimiento.dia,
  5.   &datos[i].fechaNacimiento.mes,
  6.   &datos[i].fechaNacimiento.año
  7. );

Pero antes de hacerlo debes cambiar el nombre del campo "año" por algún otro ya que el carácter 'ñ' no es valido (solo se permiten caracteres del alfabeto ingles, los dígitos '0' .. '9', el carácter '_' y no puede empezar con un dígito).

Un saludo