Problema con archivos: Reposicionamiento del puntero de registro activo.

Iniciado por FranAI, 21 Octubre 2020, 01:22 AM

0 Miembros y 1 Visitante están viendo este tema.

FranAI

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 (cpp) [Seleccionar]
#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:
Código (cpp) [Seleccionar]
#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;
}

CalgaryCorpus

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).
Aqui mi perfil en LinkedIn, invitame un cafe aqui