[ Foro de C ]

ejercicio 6.4.3

12-Feb-2016 01:54
Invitado (seba992)
1 Respuestas

Hola. Antes que nada gracias por toda la información. Quería consultar sobre el ejercicio 6.4.3.
Estoy teniendo problemas para cargar los datos desde el archivo "agenda.dat".
Acá dejo el código completo que tengo hasta ahora:


///LIBRERÍAS
#include <stdio.h>
#include <string.h>

///ESTRUCTURAS
struct nacimiento{
    int dia;
    int mes;
    int anyo;
};
struct {
    struct nacimiento nacimiento;
    char nombre[70];
    char direccion[50];
    char celular[30];
    char mail[50];
}fichas[100];

///VARIABLES
FILE* texto;
FILE* numer;
char cadena[70];
int numeroFichas;
int opcion;
int i;
int n;

///CUERPO PRINCIPAL
int main(){

    ///CARGA LOS DATOS
    texto = fopen("agenda.dat", "at");
    numer = fopen("numero.dat", "rt");
    fscanf(numer, "%d", &numeroFichas);

    int ord=0; int linea = 0;
    n = (linea-ord)/6;

    while(!feof(texto)){
        fgets(cadena, 70, texto);
        if(!feof(texto)){
            switch(ord){
                case 0:
                    sscanf(cadena, "%s", fichas[n].nombre);
                    break;
                case 1:
                    sscanf(cadena, "%d", &fichas[n].nacimiento.dia);
                    break;
                case 2:
                    sscanf(cadena, "%d", &fichas[n].nacimiento.mes);
                    break;
                case 3:
                    sscanf(cadena, "%d", &fichas[n].nacimiento.anyo);
                    break;
                case 4:
                    sscanf(cadena, "%s", fichas[n].direccion);
                    break;
                case 5:
                    sscanf(cadena, "%s", fichas[n].celular);
                    break;
                case 6:
                    sscanf(cadena, "%s", fichas[n].mail);
                    break;
                default:
                    break;
            }
            ord++;
            ord = (ord==6) ? 0 : ord;
        linea++;
        }
    }

    ///INICIA INTERACCIÓN CON EL USUARIO
    do{

        ///MENU PRINCIPAL
        printf("1.- Añadir dato\n");
        printf("2.- Ver nombres\n");
        printf("3.- Buscar ficha\n");
        printf("4.- Salir\n");
        printf("Elija una opción: ");
        scanf("%d", &opcion);
        getchar();

        ///ELIGE UNA OPCIÓN
        switch(opcion){

            ///AÑADE UN DATO
            case 1:

                ///INTROUCE LOS DATOS
                printf("Ingrese nombre: ");
                fgets(fichas[numeroFichas].nombre, 70, stdin);
                printf("Ingrese fecha de nacimiento (dd mm aaaa): ");
                scanf("%d%d%d",
                      &fichas[numeroFichas].nacimiento.dia,
                      &fichas[numeroFichas].nacimiento.mes,
                      &fichas[numeroFichas].nacimiento.anyo);
                getchar();
                printf("Ingrese dirección: ");
                fgets(fichas[numeroFichas].direccion, 50, stdin);
                printf("Ingrese número de teléfono movil: ");
                fgets(fichas[numeroFichas].celular, 30, stdin);
                printf("Ingrese dirección de e-mail: ");
                fgets(fichas[numeroFichas].mail, 50, stdin);

                ///COPIA DATOS EN "agenda.dat"
                fprintf(texto, "%s%d\n%d\n%d\n%s%s%s",
                        fichas[numeroFichas].nombre,
                        fichas[numeroFichas].nacimiento.dia,
                        fichas[numeroFichas].nacimiento.mes,
                        fichas[numeroFichas].nacimiento.anyo,
                        fichas[numeroFichas].direccion,
                        fichas[numeroFichas].celular,
                        fichas[numeroFichas].mail);

                ///SINCRONIZA NÚMERO DE FICHAS
                numeroFichas++;
                fclose(numer);
                numer = fopen("numero.dat", "wt");
                fprintf(numer, "%d", numeroFichas);
            break;

            ///MUESTRA TODOS LOS NOMBRES
            case 2:
                for(i=0; i<numeroFichas; i++){
                    printf("%02d %s", i, fichas[i].nombre);
                }
                break;

            ///BUSCA UNA FICHA POR NOMBRE
            case 3:
                printf("Ingrese nombre: ");
                fgets(cadena, 70, stdin);
                for(i=0; i<numeroFichas; i++){
                    if(strcmp(cadena, fichas[i].nombre)==0){
                        printf("Nombre: %sFecha de nacimiento: %d/%d/%d\nDirección: %sTeléfono móvil: %se-mail: %s",
                               fichas[i].nombre,
                               fichas[i].nacimiento.dia,
                               fichas[i].nacimiento.mes,
                               fichas[i].nacimiento.anyo,
                               fichas[i].direccion,
                               fichas[i].celular,
                               fichas[i].mail);
                    }
                }
                break;

            ///MUESTRA MENSAJE DE FINALIZACIÓN DEL PROGRAMA
            case 4:
                printf("HASTA LUEGO!");
                break;

            ///MUESTRA MENSAJE SI LA OPCIÓN ELEGIDA NO ES VÁLIDA
            default:
                printf("OPCIÓN INCORRECTA!!!\n");
                break;
        }//FIN DEL SWITCH
        printf("\n");//SALTO DE LÍNEA
    }while(opcion!=4);//FIN DEL BUCLE DO-WHILE

    ///FINALIZACION
    fclose(texto);
    fclose(numer);

    return 0;
}


La sección que dice CARGA LOS DATOS me está dando problemas. No sé como decirle al programa que lea desde agenda.dat  y lo asigna al array que corresponda. Si comento la parte del bucle while el código funciona, pero sin cargar los valores asignados  en la ejecución anterior. Gracias.


15-Feb-2016 00:44
Nacho Cabanes (+83)

Imagino que te refieres a este ejercicio (la numeración puede variar entre versiones del curso):

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.

Si lo que falla es la opción de cargar, sería importante ver cómo es tu fichero de datos. Tal y como está organizada la lectura ahora mismo, parece que lees cada conjunto de datos de una única línea (lo que te dará problemas si el nombre está formado por más de una palabra, por ejemplo). Tendrás el mismo problema con la dirección. Puedes mostrar en pantalla los datos que lees, como ayuda sencilla para la depuración. Además, deberías cerrar el fichero tras la lectura, para volverlo a abrir en el momento de escribir los datos resultantes.






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