agenda y archivos

Iniciado por m@o_614, 28 Octubre 2013, 23:10 PM

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

m@o_614

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??

#include <stdlib.h>
#include <string.h>
#define AGREGAR 1
#define VISUALIZAR 2
#define MOSTRAR 3
#define SALIR 4
#define TAM 3
#define MAX 45
typedef struct datos
{
    char nombre[MAX];
    char direccion[MAX];
    char tlf_movil[MAX];
    char email[MAX];/*
    Fecha fechaNacimiento;*/
}Agenda;

void agregar_Persona(Agenda persona[],int i);
void visualizar_Nombres(Agenda persona[],int i);
void mostrar_datos(char nombreBuscar[],Agenda persona[],int i);

int main()
{
    int i = 0,continuar = 1,opcion;
    char nombreBuscar[MAX],op[TAM];
    FILE *fd;
    Agenda persona[TAM];/*
    if((fd = fopen("F:\\agenda.dat","w"))!= NULL)
    {*/
        do
        {
            printf("Menu\n");
            printf("1)Agregar Registro\n");
            printf("2)Visualizar Nombres\n");
            printf("3)Mostrar datos\n");
            printf("4)Salir\n");
            fgets(op,TAM,stdin);
            sscanf(op,"%d",&opcion);
            switch(opcion)
            {
                case AGREGAR:
                   if(i < TAM)
                   {
                       agregar_Persona(persona,i);
                       i++;
                   }
                   else
                      printf("No se permiten agregar mas de 100 registros");
                   break;
                case VISUALIZAR:
                   visualizar_Nombres(persona,i);
                   break;
                case MOSTRAR:
                   printf("Dame el nombre de la persona a mostrar: ");
                   fgets(nombreBuscar,MAX,stdin);
                   mostrar_datos(nombreBuscar,persona,i);
                   break;
                case SALIR:
                   continuar = 0;
                   break;
                default : printf("Opcion invalida!");
            }
            if(continuar)
            {
                system("pause");
                system("cls");
            }
        }while(continuar);
/*
    }*/
    return 0;
}

void agregar_Persona(Agenda persona[],int i)
{
    char cadena[MAX];
    printf("Dame nombre:\n");
    fgets(persona[i].nombre,MAX,stdin);
    printf("Dame direccion:\n");
    fgets(persona[i].direccion,MAX,stdin);
    printf("Dame telefono movil:\n");
    fgets(persona[i].tlf_movil,MAX,stdin);
    printf("Dame email:\n");
    fgets(persona[i].email,MAX,stdin);
    system("cls");
}

void visualizar_Nombres(Agenda persona[],int i)
{
    int j;
    for(j = 0;j < i;j++)
       printf("%s\n",persona[j].nombre);
}

void mostrar_datos(char nombreBuscar[],Agenda persona[],int i)
{
    int j;
    for(j = 0;j < i;j++)
    {
        if((strcmp(nombreBuscar,persona[j].nombre))== NULL)
        {
            printf("%s\n",persona[j].nombre);
            printf("%s\n",persona[j].direccion);
            printf("%s\n",persona[j].tlf_movil);
            printf("%s\n",persona[j].email);
        }
    }
}

rir3760

Cita de: m@o_614 en 28 Octubre 2013, 23:10 PMhay 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.

Cita de: m@o_614 en 28 Octubre 2013, 23:10 PMy 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
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

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:
if((strcmp(nombreBuscar,persona[j].nombre))== NULL)

y el codigo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define AGREGAR 1
#define VISUALIZAR 2
#define MOSTRAR 3
#define SALIR 4
#define TAM 3
#define MAX 45
/*
   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 podra añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar 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.
*/
typedef struct datos
{
    char nombre[MAX];
    char direccion[MAX];
    char tlf_movil[MAX];
    char email[MAX];
}Agenda;

void agregar_Persona(Agenda persona[],int i);
void visualizar_Nombres(Agenda persona[],int i);
void mostrar_datos(char nombreBuscar[],Agenda persona[],int i);

int main()
{
    int i = 0,continuar = 1,opcion;
    char nombreBuscar[MAX],op[TAM];
    FILE *fd,*ap;
    Agenda persona[TAM];
    if((fd = fopen("F:\\agenda.dat","r"))!= NULL)
    {
        do
        {
            printf("Menu\n");
            printf("1)Agregar Registro\n");
            printf("2)Visualizar Nombres\n");
            printf("3)Mostrar datos\n");
            printf("4)Salir\n");
            fgets(op,TAM,stdin);
            sscanf(op,"%d",&opcion);
            switch(opcion)
            {
                case AGREGAR:
                   if(i < TAM)
                   {
                       agregar_Persona(persona,i);
                       i++;
                   }
                   else
                      printf("No se permiten agregar mas de 100 registros");
                   break;
                case VISUALIZAR:
                   visualizar_Nombres(persona,i);
                   break;
                case MOSTRAR:
                   printf("Dame el nombre de la persona a mostrar: ");
                   fgets(nombreBuscar,MAX,stdin);
                   mostrar_datos(nombreBuscar,persona,i);
                   break;
                case SALIR:
                   continuar = 0;
                   break;
                default : printf("Opcion invalida!");
            }
            if(continuar)
            {
                system("pause");
                system("cls");
            }
        }while(continuar);
    }
    fclose(fd);
    if((ap = fopen("F:\\agenda.dat","w"))!= NULL)
       fwrite(persona,TAM,sizeof(char),ap);
    return 0;
}

void agregar_Persona(Agenda persona[],int i)
{
    char cadena[MAX];
    printf("Dame nombre:\n");
    fgets(persona[i].nombre,MAX,stdin);
    printf("Dame direccion:\n");
    fgets(persona[i].direccion,MAX,stdin);
    printf("Dame telefono movil:\n");
    fgets(persona[i].tlf_movil,MAX,stdin);
    printf("Dame email:\n");
    fgets(persona[i].email,MAX,stdin);
}

void visualizar_Nombres(Agenda persona[],int i)
{
    int j;
    for(j = 0;j < i;j++)
       printf("%s\n",persona[j].nombre);
}

void mostrar_datos(char nombreBuscar[],Agenda persona[],int i)
{
    int j,encontrado = 0;
    for(j = 0;((j < i)&&(!encontrado));j++)
    {
        if((strcmp(nombreBuscar,persona[j].nombre))== NULL)//aqui me aparece un warning
        {
            printf("%s\n",persona[j].nombre);
            printf("%s\n",persona[j].direccion);
            printf("%s\n",persona[j].tlf_movil);
            printf("%s\n",persona[j].email);
            encontrado = 1;
        }
    }
}

rir3760

Cita de: m@o_614 en 29 Octubre 2013, 02:22 AMpor 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:
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:
if (strcmp(nombreBuscar, persona[j].nombre) == 0)

Un saludo
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

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:

ypedef struct
{
    int dia;
    int mes;
    int año;
}Fecha;

typedef struct datos
{
    char nombre[MAX];
    char direccion[MAX];
    char tlf_movil[MAX];
    char email[MAX];
    Fecha fechaNacimiento;
}Agenda;


y despues quiero agregarle la fecha de nacimiento usando el fgets y el sscanf podria ser de esta manera??
void agregar_Persona(Agenda persona[],int i)
{
    char cadena[MAX];
    printf("Dame nombre:\n");
    fgets(persona[i].nombre,MAX,stdin);
    printf("Dame direccion:\n");
    fgets(persona[i].direccion,MAX,stdin);
    printf("Dame telefono movil:\n");
    fgets(persona[i].tlf_movil,MAX,stdin);
    printf("Dame email:\n");
    fgets(persona[i].email,MAX,stdin);
    printf("Dame fecha de nacimiento:\n");
    fgets(cadena,MAX,stdin);
    sscanf(cadena,"%d",&datos[i].fechaNacimiento.dia);
    sscanf(cadena,"%d",&datos[i].fechaNacimiento.mes);
    sscanf(cadena,"%d",&datos[i].fechaNacimiento.año);
}

con un solo arreglo cadena para almacenar dia mes y año aunque sean campos diferentes

gracias

rir3760

Cita de: m@o_614 en 29 Octubre 2013, 21:22 PMsi 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"):
puts("Dame fecha de nacimiento:");
fgets(cadena, MAX, stdin);
sscanf(
   cadena, "%d %d %d",
   &datos[i].fechaNacimiento.dia,
   &datos[i].fechaNacimiento.mes,
   &datos[i].fechaNacimiento.año
);


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
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