elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  agenda y archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: agenda y archivos  (Leído 2,819 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
agenda y archivos
« 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.  


« Última modificación: 28 Octubre 2013, 23:36 pm por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: agenda y archivos
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: agenda y archivos
« Respuesta #2 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.  
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: agenda y archivos
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: agenda y archivos
« Respuesta #4 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
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: agenda y archivos
« Respuesta #5 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Agenda bat V1 by my
Scripting
J3FFR3Y .4 C3D3Ñ0 0 3,746 Último mensaje 17 Diciembre 2006, 21:46 pm
por J3FFR3Y .4 C3D3Ñ0
Agenda java « 1 2 »
Java
Burnhack 13 52,099 Último mensaje 6 Marzo 2008, 00:47 am
por Burnhack
Necesito ayuda!! agenda electronica con archivos secuenciales creada en pascal
Ejercicios
colillo 1 4,188 Último mensaje 1 Mayo 2012, 23:02 pm
por colillo
agenda archivos binarios
Programación C/C++
kuni2006 5 2,629 Último mensaje 5 Agosto 2016, 17:19 pm
por kuni2006
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines