[ Foro de C ]
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.
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.)