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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Problemas con estructura anidada y archivos binarios en: 30 Agosto 2019, 17:20 pm
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:

Código
  1. typedef struct
  2. {
  3. char fecha[11];
  4. float notaParcial;
  5. }Parcial;
  6.  
  7. typedef struct
  8. {
  9. char nomAsignatura[60];
  10. int codAsignatura;
  11. float notaAsignatura;
  12. int numParciales;
  13. Parcial *parciales;
  14. }Asig;
  15.  
  16.  
  17. typedef struct
  18. {
  19. char nombre[100];
  20. char expediente[20];
  21. int numAsig;
  22. Asig *asignaturas;
  23. }Alumnos;


Estos datos se guardan en un árbol binario para posteriormente guardarlos en un Fichero binario. Hago lo siguiente:

Código
  1. void procesar(void *datos)
  2. {
  3.  
  4. Alumnos * A = (Alumnos*)datos;
  5. int i, j;
  6. FILE* pf;
  7. FILE *pf_lectura;
  8. pf = fopen("mifichero", "ab"); //abrimos modo append para añada al final cada
  9.  
  10. Alumnos *B = NULL;
  11. int resultado = 0;
  12.  
  13.  
  14.  
  15. if (pf != NULL)
  16. {
  17.  
  18. //Guardatos datos estaticos del alumno
  19. 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)
  20. fwrite(A->expediente, sizeof(A->expediente),1, pf);
  21. fwrite(&A->numAsig, sizeof(A->numAsig), 1, pf);
  22. //ahora grabamos datos de asignaturas y parciales
  23. for (i = 0; i < A->numAsig; i++) {
  24. fwrite(A->asignaturas[i].nomAsignatura, sizeof(A->asignaturas[i].nomAsignatura),1, pf);
  25. fwrite(&A->asignaturas[i].codAsignatura, sizeof(A->asignaturas[i].codAsignatura), 1, pf);
  26. fwrite(&A->asignaturas[i].notaAsignatura, sizeof(A->asignaturas[i].notaAsignatura), 1, pf);
  27. fwrite(&A->asignaturas[i].numParciales, sizeof(A->asignaturas[i].numParciales), 1, pf);
  28. //ahora grabamos los datos de los parciales
  29. for (j = 0; j < A->asignaturas[i].numParciales; j++) {
  30. fwrite(A->asignaturas[i].parciales[j].fecha, sizeof(A->asignaturas[i].parciales[j].fecha),1, pf);
  31. fwrite(&A->asignaturas[i].parciales[j].notaParcial, sizeof(A->asignaturas[i].parciales[j].notaParcial), 1, pf);
  32.  
  33. }
  34.  
  35. }
  36. fclose(pf);
  37.  
  38. }
  39.  
  40.  
  41. printf(">>>\t\t Imprimo Arbol>>>>\n\n");
  42.  
  43.  
  44.  
  45.  
  46. for (i = 0; i < A->numAsig; i++)
  47. {
  48.  
  49. printf("Nombre: %s\n", A->nombre);
  50. printf("Expediente: %s\n", A->expediente);
  51. printf("Numero de asignaturas: %d\n", A->numAsig);
  52.  
  53.  
  54. printf("Nombre de asignatura: %s\n", A->asignaturas[i].nomAsignatura);
  55. printf("Codigo de asignatura: %d\n", A->asignaturas[i].codAsignatura);
  56. printf("Nota de asignatura: %g\n", A->asignaturas[i].notaAsignatura);
  57. printf("Numero de parciales: %d\n", A->asignaturas[i].numParciales);
  58.  
  59. for (j = 0; j < A->asignaturas[i].numParciales; j++)
  60. {
  61.  
  62. printf("Fecha: %s\n", A->asignaturas[i].parciales[j].fecha);
  63. printf("Nota de parcial: %g\n", A->asignaturas[i].parciales[j].notaParcial);
  64.  
  65. }
  66. }
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. //Leer fichero
  74.  
  75.  
  76. //Reservo memoria para leer datos
  77.  
  78. //Asignamos memoria para un objeto de tipo alumnos.
  79. B = (Alumnos*)malloc(sizeof(Alumnos));
  80.  
  81. //Reservo memoria para Asignaturas
  82. B->asignaturas = (Asig*)malloc(A->numAsig * sizeof(Asig));
  83.  
  84. for (i = 0; i < A->numAsig; i++)
  85. {
  86. //Reservo memoria para parciales
  87. B->asignaturas[i].parciales = (Parcial*)malloc(A->asignaturas[i].numParciales * sizeof(Parcial));
  88. }
  89.  
  90.  
  91. pf_lectura = fopen("mifichero", "rb");
  92.  
  93. if (!pf)
  94. printf("No se puede leer el fichero.\n");
  95.  
  96.  
  97.  
  98.  
  99. printf(">>>>\t\tImprimiendo datos desde el fichero binario.\n");
  100.  
  101. resultado += fread(B->nombre, sizeof(B->nombre), 1, pf_lectura);
  102. printf("Nombre: %s\n", B->nombre);
  103. resultado += fread(B->expediente, sizeof(B->expediente), 1, pf_lectura);
  104. printf("Expediente: %s\n", B->expediente);
  105. resultado += fread(&B->numAsig, sizeof(B->numAsig), 1, pf_lectura);
  106. printf("Numero de asignaturas: %d\n", B->numAsig);
  107.  
  108.  
  109. for (i = 0; i < B->numAsig; i++)
  110. {
  111.  
  112. resultado += fread(B->asignaturas[i].nomAsignatura, sizeof(B->asignaturas[i].nomAsignatura), 1, pf_lectura);
  113. printf("Nombre de asignatura: %s\n", B->asignaturas[i].nomAsignatura);
  114. resultado += fread(&B->asignaturas[i].codAsignatura, sizeof(B->asignaturas[i].codAsignatura), 1, pf_lectura);
  115. printf("Codigo de asignatura: %d\n", B->asignaturas[i].codAsignatura);
  116. resultado += fread(&B->asignaturas[i].notaAsignatura, sizeof(B->asignaturas[i].notaAsignatura), 1, pf_lectura);
  117. printf("Nota de asignatura: %g\n", B->asignaturas[i].notaAsignatura);
  118. resultado += fread(&B->asignaturas[i].numParciales, sizeof(B->asignaturas[i].numParciales), 1, pf_lectura);
  119. printf("Numero de parciales: %d\n", B->asignaturas[i].numParciales);
  120.  
  121. for (j = 0; j < B->asignaturas[i].numParciales; j++)
  122. {
  123. resultado += fread(B->asignaturas[i].parciales[j].fecha, sizeof(B->asignaturas[i].parciales[j].fecha), 1, pf_lectura);
  124. printf("Fecha: %s\n", B->asignaturas[i].parciales[j].fecha);
  125. resultado += fread(&B->asignaturas[i].parciales[j].notaParcial, sizeof(B->asignaturas[i].parciales[j].notaParcial), 1, pf_lectura);
  126. printf("Nota de parcial: %g\n", B->asignaturas[i].parciales[j].notaParcial);
  127.  
  128. }
  129.  
  130.  
  131. printf("Se han leido: %d bytes\n", resultado);
  132. fseek(pf_lectura, sizeof(resultado), SEEK_SET);
  133. }
  134.  
  135.  
  136.  
  137. fclose(pf_lectura);
  138. free(B);
  139.  
  140.  
  141.  
  142. }
  143.  


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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines