Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: FranAI en 21 Octubre 2020, 01:22 am



Título: Problema con archivos: Reposicionamiento del puntero de registro activo.
Publicado por: FranAI en 21 Octubre 2020, 01:22 am
Tengo un  archivo  con  la  siguiente  información  en  cada registro:  Legajo  del  alumno,  altura  y  peso.  Debo determinar  el  peso máximo  y  el  mínimo. Primero ordené los registros con un algoritmo de ordenamiento y luego reposiciono el puntero al comienzo y al final del registro para obtener el alumno de menor y mayor peso. El problema se dá en el dato de mayor peso, no me devuelve el dato correcto y no veo que puede estar mal.
Este es el cpp de carga:
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. using namespace std;
  6. struct registro{
  7. int legajo, altura, peso;
  8. };
  9.  
  10. int main()
  11. {
  12. FILE *p = fopen("registros2.dat", "ab");
  13. if(p == NULL)
  14. {
  15. cout << "Error al abrir el archivo.";
  16. exit(1);
  17. }
  18. else
  19. {
  20. registro alumnos[10];
  21. for(int i = 0; i < 10; i++)
  22. {
  23. cout << "Legajo alumno "<< i+1 <<": ";
  24. cin >> alumnos[i].legajo;
  25. cout << "Altura: ";
  26. cin >> alumnos[i].altura;
  27. cout << "Peso: ";
  28. cin >> alumnos[i].peso;
  29. fwrite(&alumnos[i], sizeof(registro), 1, p);
  30. }
  31. fclose(p);
  32. }
  33. system("pause");
  34. return 0;
  35. }
  36.  
cpp de proceso:
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. using namespace std;
  6. struct registro{
  7. int legajo, altura, peso;
  8. };registro alumnos[10];
  9.  
  10. void peso_mayor_menor(FILE *p)
  11. {
  12. int aux=0, aux1=0, aux2=0, res=0;
  13. while(feof(p)==0)
  14. {
  15. fread(&alumnos, sizeof(registro), 1, p);
  16. for (int i = 0; i < 9; i++)
  17.     {
  18.         for (int j = i + 1; j < 10; j++)
  19.         {
  20.             if (alumnos[i].peso > alumnos[j].peso)
  21.             {
  22.                 aux = alumnos[i].peso;
  23.                 alumnos[i].peso = alumnos[j].peso;
  24.                 alumnos[j].peso = aux;
  25.  
  26.                 aux1 = alumnos[i].legajo;
  27.                 alumnos[i].legajo = alumnos[j].legajo;
  28.                 alumnos[j].legajo = aux1;
  29.  
  30.                 aux2 = alumnos[i].altura;
  31.                 alumnos[i].altura = alumnos[j].altura;
  32.                 alumnos[j].altura = aux2;
  33.             }
  34. }
  35. }
  36. }
  37. for(int i = 0; i < 10; i++)
  38. {
  39. cout << "Legajo " << ": " << alumnos[i].legajo << endl;
  40. cout << "Peso " << ": " << alumnos[i].peso << endl;
  41. cout << "Altura " << ": " << alumnos[i].altura << endl << endl;
  42. }
  43. long tam = 0 * sizeof(registro);
  44. res = fseek (p,  tam, SEEK_CUR);
  45.  
  46. if (res == 0)
  47. {
  48. fread (&alumnos, sizeof (registro), 1, p);
  49. cout << "ALUMNO DE MENOR PESO" << endl;
  50. cout << "Legajo: " << alumnos[tam].legajo << endl;
  51. cout << "Peso: " << alumnos[tam].peso << endl << endl;
  52.  
  53. }
  54. rewind(p);
  55. long tam1 = 0 * sizeof(registro);
  56. int res1 = fseek (p, tam1, SEEK_CUR);
  57. if(res==0)
  58. {
  59. fread (&alumnos, sizeof (registro), 1, p);
  60. cout << "ALUMNO DE MAYOR PESO" << endl;
  61. cout << "Legajo: " << alumnos[tam1].legajo << endl;
  62. cout << "Peso: " << alumnos[tam1].peso << endl << endl;
  63. }
  64. }
  65. //void altura_mayor_menor(FILE *p)
  66. //{
  67.  
  68. //}
  69. int main()
  70. {
  71. FILE *p = fopen("registros2.dat", "rb");
  72. if(p == NULL)
  73. {
  74. cout << "Error al abrir el archivo.";
  75. exit(1);
  76. }
  77. else
  78. {
  79. peso_mayor_menor(p);
  80. //altura_mayor_menor(p);
  81. }
  82. system("pause");
  83. fclose(p);
  84. return 0;
  85. }
  86.  


Título: Re: Problema con archivos: Reposicionamiento del puntero de registro activo.
Publicado por: CalgaryCorpus en 23 Octubre 2020, 05:43 am
Tienes los datos en un archivo, los pasas a un arreglo, lo ordenas en memoria, no en disco.
No tiene sentido desplazarte en el disco con fseek si los datos ya los tienes en memoria ordenados.

Los datos en disco no se mueven de ninguna manera, tengo la impresion que crees que cuando intercambias en el arreglo, estas intercambiando en el archivo y por eso te mueves al final o al inicio para recuperar el menor o mayor, cuando en realidad deberias preguntarle directamente al arreglo por esos valores (si es que esta bien la ordenacion que hiciste).


Título: Re: Problema con archivos: Reposicionamiento del puntero de registro activo.
Publicado por: FranAI en 23 Octubre 2020, 23:02 pm
Muchas gracias!