Hola. Soy nuevo en el foro y busco que alguien me eche una mano con un problema que tengo. Verán, estoy haciendo un modelo de examen. El cual tiene las siguientes estructuras:
Estos datos se guardan en un árbol binario para posteriormente guardarlos en un Fichero binario. Hago lo siguiente:
Con este código, si guardo una sola persona con todos sus datos, puedo leer el fichero son problemas. Pero cuando guardo más de uno... por ejemplo 2. Me imprime solo uno.
Lo muestro para que vean:
Introducir datos. Finlizar con eof.
--------------
Nombre de Alumno: ruben
Expediente: ruben
Numero de asignaturas: 1
Nombre de asignatura: ruben
Codigo de asignatura: 1
Numero de parciales realizados: 1
Fecha de parcial 1: 1
Nota de parcial 1: 1
Desea seguir agregando alumnos? (1-si/0-no)
1
--------------
Nombre de Alumno: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Numero de parciales realizados: 1
Fecha de parcial 1: 1
Nota de parcial 1: 1
Desea seguir agregando alumnos? (1-si/0-no)
0
Arbol:
>>> Imprimo Arbol>>>>
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
>>>> Imprimiendo datos desde el fichero binario.
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
Se han leido: 9 bytes
>>> Imprimo Arbol>>>>
Nombre: ruben
Expediente: ruben
Numero de asignaturas: 1
Nombre de asignatura: ruben
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
>>>> Imprimiendo datos desde el fichero binario.
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
Se han leido: 9 bytes
Presione una tecla para continuar . . .
¿Por qué solo me imprime a "juan" y no a "ruben" y cuál sería la manera correcta de poder imprimir mi fichero?
La manera en que se escribe el fichero es definida por el profesor, y me pide que lea el fichero.
Muchas gracias por la ayuda que puedan brindarme.
Código (c) [Seleccionar]
typedef struct
{
char fecha[11];
float notaParcial;
}Parcial;
typedef struct
{
char nomAsignatura[60];
int codAsignatura;
float notaAsignatura;
int numParciales;
Parcial *parciales;
}Asig;
typedef struct
{
char nombre[100];
char expediente[20];
int numAsig;
Asig *asignaturas;
}Alumnos;
Estos datos se guardan en un árbol binario para posteriormente guardarlos en un Fichero binario. Hago lo siguiente:
Código (c) [Seleccionar]
void procesar(void *datos)
{
Alumnos * A = (Alumnos*)datos;
int i, j;
FILE* pf;
FILE *pf_lectura;
pf = fopen("mifichero", "ab"); //abrimos modo append para añada al final cada
Alumnos *B = NULL;
int resultado = 0;
if (pf != NULL)
{
//Guardatos datos estaticos del alumno
fwrite(A->nombre, sizeof(A->nombre),1, pf); //fwrite(que voy a grabar, tamaño del tipo de dato, tamaño de datos vas a grabar?,archivo)
fwrite(A->expediente, sizeof(A->expediente),1, pf);
fwrite(&A->numAsig, sizeof(A->numAsig), 1, pf);
//ahora grabamos datos de asignaturas y parciales
for (i = 0; i < A->numAsig; i++) {
fwrite(A->asignaturas[i].nomAsignatura, sizeof(A->asignaturas[i].nomAsignatura),1, pf);
fwrite(&A->asignaturas[i].codAsignatura, sizeof(A->asignaturas[i].codAsignatura), 1, pf);
fwrite(&A->asignaturas[i].notaAsignatura, sizeof(A->asignaturas[i].notaAsignatura), 1, pf);
fwrite(&A->asignaturas[i].numParciales, sizeof(A->asignaturas[i].numParciales), 1, pf);
//ahora grabamos los datos de los parciales
for (j = 0; j < A->asignaturas[i].numParciales; j++) {
fwrite(A->asignaturas[i].parciales[j].fecha, sizeof(A->asignaturas[i].parciales[j].fecha),1, pf);
fwrite(&A->asignaturas[i].parciales[j].notaParcial, sizeof(A->asignaturas[i].parciales[j].notaParcial), 1, pf);
}
}
fclose(pf);
}
printf(">>>\t\t Imprimo Arbol>>>>\n\n");
for (i = 0; i < A->numAsig; i++)
{
printf("Nombre: %s\n", A->nombre);
printf("Expediente: %s\n", A->expediente);
printf("Numero de asignaturas: %d\n", A->numAsig);
printf("Nombre de asignatura: %s\n", A->asignaturas[i].nomAsignatura);
printf("Codigo de asignatura: %d\n", A->asignaturas[i].codAsignatura);
printf("Nota de asignatura: %g\n", A->asignaturas[i].notaAsignatura);
printf("Numero de parciales: %d\n", A->asignaturas[i].numParciales);
for (j = 0; j < A->asignaturas[i].numParciales; j++)
{
printf("Fecha: %s\n", A->asignaturas[i].parciales[j].fecha);
printf("Nota de parcial: %g\n", A->asignaturas[i].parciales[j].notaParcial);
}
}
//Leer fichero
//Reservo memoria para leer datos
//Asignamos memoria para un objeto de tipo alumnos.
B = (Alumnos*)malloc(sizeof(Alumnos));
//Reservo memoria para Asignaturas
B->asignaturas = (Asig*)malloc(A->numAsig * sizeof(Asig));
for (i = 0; i < A->numAsig; i++)
{
//Reservo memoria para parciales
B->asignaturas[i].parciales = (Parcial*)malloc(A->asignaturas[i].numParciales * sizeof(Parcial));
}
pf_lectura = fopen("mifichero", "rb");
if (!pf)
printf("No se puede leer el fichero.\n");
printf(">>>>\t\tImprimiendo datos desde el fichero binario.\n");
resultado += fread(B->nombre, sizeof(B->nombre), 1, pf_lectura);
printf("Nombre: %s\n", B->nombre);
resultado += fread(B->expediente, sizeof(B->expediente), 1, pf_lectura);
printf("Expediente: %s\n", B->expediente);
resultado += fread(&B->numAsig, sizeof(B->numAsig), 1, pf_lectura);
printf("Numero de asignaturas: %d\n", B->numAsig);
for (i = 0; i < B->numAsig; i++)
{
resultado += fread(B->asignaturas[i].nomAsignatura, sizeof(B->asignaturas[i].nomAsignatura), 1, pf_lectura);
printf("Nombre de asignatura: %s\n", B->asignaturas[i].nomAsignatura);
resultado += fread(&B->asignaturas[i].codAsignatura, sizeof(B->asignaturas[i].codAsignatura), 1, pf_lectura);
printf("Codigo de asignatura: %d\n", B->asignaturas[i].codAsignatura);
resultado += fread(&B->asignaturas[i].notaAsignatura, sizeof(B->asignaturas[i].notaAsignatura), 1, pf_lectura);
printf("Nota de asignatura: %g\n", B->asignaturas[i].notaAsignatura);
resultado += fread(&B->asignaturas[i].numParciales, sizeof(B->asignaturas[i].numParciales), 1, pf_lectura);
printf("Numero de parciales: %d\n", B->asignaturas[i].numParciales);
for (j = 0; j < B->asignaturas[i].numParciales; j++)
{
resultado += fread(B->asignaturas[i].parciales[j].fecha, sizeof(B->asignaturas[i].parciales[j].fecha), 1, pf_lectura);
printf("Fecha: %s\n", B->asignaturas[i].parciales[j].fecha);
resultado += fread(&B->asignaturas[i].parciales[j].notaParcial, sizeof(B->asignaturas[i].parciales[j].notaParcial), 1, pf_lectura);
printf("Nota de parcial: %g\n", B->asignaturas[i].parciales[j].notaParcial);
}
printf("Se han leido: %d bytes\n", resultado);
fseek(pf_lectura, sizeof(resultado), SEEK_SET);
}
fclose(pf_lectura);
free(B);
}
Con este código, si guardo una sola persona con todos sus datos, puedo leer el fichero son problemas. Pero cuando guardo más de uno... por ejemplo 2. Me imprime solo uno.
Lo muestro para que vean:
Introducir datos. Finlizar con eof.
--------------
Nombre de Alumno: ruben
Expediente: ruben
Numero de asignaturas: 1
Nombre de asignatura: ruben
Codigo de asignatura: 1
Numero de parciales realizados: 1
Fecha de parcial 1: 1
Nota de parcial 1: 1
Desea seguir agregando alumnos? (1-si/0-no)
1
--------------
Nombre de Alumno: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Numero de parciales realizados: 1
Fecha de parcial 1: 1
Nota de parcial 1: 1
Desea seguir agregando alumnos? (1-si/0-no)
0
Arbol:
>>> Imprimo Arbol>>>>
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
>>>> Imprimiendo datos desde el fichero binario.
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
Se han leido: 9 bytes
>>> Imprimo Arbol>>>>
Nombre: ruben
Expediente: ruben
Numero de asignaturas: 1
Nombre de asignatura: ruben
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
>>>> Imprimiendo datos desde el fichero binario.
Nombre: juan
Expediente: juan
Numero de asignaturas: 1
Nombre de asignatura: juan
Codigo de asignatura: 1
Nota de asignatura: 1
Numero de parciales: 1
Fecha: 1
Nota de parcial: 1
Se han leido: 9 bytes
Presione una tecla para continuar . . .
¿Por qué solo me imprime a "juan" y no a "ruben" y cuál sería la manera correcta de poder imprimir mi fichero?
La manera en que se escribe el fichero es definida por el profesor, y me pide que lea el fichero.
Muchas gracias por la ayuda que puedan brindarme.