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:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
struct registro{
int legajo, altura, peso;
};
int main()
{
FILE *p = fopen("registros2.dat", "ab");
if(p == NULL)
{
cout << "Error al abrir el archivo.";
exit(1);
}
else
{
registro alumnos[10];
for(int i = 0; i < 10; i++)
{
cout << "Legajo alumno "<< i+1 <<": ";
cin >> alumnos[i].legajo;
cout << "Altura: ";
cin >> alumnos[i].altura;
cout << "Peso: ";
cin >> alumnos[i].peso;
fwrite(&alumnos[i], sizeof(registro), 1, p);
}
fclose(p);
}
system("pause");
return 0;
}
cpp de proceso:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
struct registro{
int legajo, altura, peso;
};registro alumnos[10];
void peso_mayor_menor(FILE *p)
{
int aux=0, aux1=0, aux2=0, res=0;
while(feof(p)==0)
{
fread(&alumnos, sizeof(registro), 1, p);
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
if (alumnos[i].peso > alumnos[j].peso)
{
aux = alumnos[i].peso;
alumnos[i].peso = alumnos[j].peso;
alumnos[j].peso = aux;
aux1 = alumnos[i].legajo;
alumnos[i].legajo = alumnos[j].legajo;
alumnos[j].legajo = aux1;
aux2 = alumnos[i].altura;
alumnos[i].altura = alumnos[j].altura;
alumnos[j].altura = aux2;
}
}
}
}
for(int i = 0; i < 10; i++)
{
cout << "Legajo " << ": " << alumnos[i].legajo << endl;
cout << "Peso " << ": " << alumnos[i].peso << endl;
cout << "Altura " << ": " << alumnos[i].altura << endl << endl;
}
long tam = 0 * sizeof(registro);
res = fseek (p, tam, SEEK_CUR);
if (res == 0)
{
fread (&alumnos, sizeof (registro), 1, p);
cout << "ALUMNO DE MENOR PESO" << endl;
cout << "Legajo: " << alumnos[tam].legajo << endl;
cout << "Peso: " << alumnos[tam].peso << endl << endl;
}
rewind(p);
long tam1 = 0 * sizeof(registro);
int res1 = fseek (p, tam1, SEEK_CUR);
if(res==0)
{
fread (&alumnos, sizeof (registro), 1, p);
cout << "ALUMNO DE MAYOR PESO" << endl;
cout << "Legajo: " << alumnos[tam1].legajo << endl;
cout << "Peso: " << alumnos[tam1].peso << endl << endl;
}
}
//void altura_mayor_menor(FILE *p)
//{
//}
int main()
{
FILE *p = fopen("registros2.dat", "rb");
if(p == NULL)
{
cout << "Error al abrir el archivo.";
exit(1);
}
else
{
peso_mayor_menor(p);
//altura_mayor_menor(p);
}
system("pause");
fclose(p);
return 0;
}
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).
Muchas gracias!