Ordenar el contenido de un fichero binario en C++

Programa C++ que lea el fichero binario "sueldos2.dat" creado en una entrada anterior y muestre los empleados ordenados por sueldo, de menor a mayor.
Utiliza un array dinámico para realizar la ordenación.
Para ordenar el array se utilizará el método de ordenación de la burbuja
Los datos de cada empleado se han escrito en el fichero utilizando la siguiente estructura:
struct Templeado
{
           char nombre[20];
           char apellidos[20];
           char departamento[20];
           float sueldo;
};

#include <iostream>
#include <fstream>
using namespace std;
struct Templeado
{
    char nombre[20];
    char apellidos[20];
    char departamento[20];
    float sueldo;
};
void burbuja(Templeado [], int);
int main()
{
    Templeado registro, *array;
    int tamanyo = sizeof(Templeado); // Tamaño de un registro
    int i = 0, num_registros;
    ifstream in;
    in.open("sueldos2.dat", ios::binary);
    if(in.fail())
    {
       cout << "Error al abrir el fichero sueldos2.dat" << endl;
       system("pause");
       exit(1);
    }

    //cálculo del número de registros del fichero
    in.seekg(0,ios::end); //nos posicionamos al final del fichero
    //número de registros = bytes / tamaño en bytes de un registro
    num_registros=in.tellg()/tamanyo;

    //creamos el array con el tamaño calculado
    array = new Templeado[num_registros];
    if(array==NULL)
    {
       cout << "Error en la asignación de memoria\n";
       system("pause");
       exit(1);
    }

    in.seekg(0); //volvemos al pincipio del fichero
    // Pasamos los registros al array
    in.read((char *) &array[i], tamanyo);
    while(!in.eof())
    {
         i++;
         in.read((char *) &array[i], tamanyo);
    }
    burbuja(array,num_registros); //ordenar el array
   
    //mostrar todos los empleados ordenados por sueldo
    for(i=0;i<num_registros;i++)
    {
            cout << "\nEMPLEADO: " << i+1 << endl;
            cout << "Nombre: " << array[i].nombre << endl;
            cout << "Apellidos: " << array[i].apellidos << endl;
            cout << "Departamento: " << array[i].departamento << endl;
            cout << "Sueldo: " << array[i].sueldo << endl;
    }
    in.close();
    delete [] array;
    system("pause");
}

//función para ordenar el array de empleados por el método de la burbuja
void burbuja(Templeado A[], int N)
{
    int i, j;
    Templeado aux;
    for(i=0;i<N-1;i++)      
        for(j=0;j<N-i-1;j++)
            if(A[j+1].sueldo<A[j].sueldo) 
            {               
              aux=A[j+1];   
              A[j+1]=A[j];  
              A[j]=aux;
            }
}

1 comentario:

  1. Hola, muy útil el post.
    Veo sencillo saber el número de líneas si se usan struct, pero... y si no sabes el tamaño de la lineaque lees en el fichero binario. Hay alguna forma de obtenerlo? Muchas gracias de antemano

    ResponderEliminar