Ejemplo de Cargar varios registros en un archivo y actualizar el sueldo

#include <stdio.h>
#include <stdlib.h>

#define CANT_EMPLEADO 8
#define NOM_ARCH_EMPL "Empleados.dat"

typedef struct{
  int legajo;
  char nombre[30];
  float sueldo;
}Empleados;

int generarArchivoEmpleados(const char* Nom_arch)
{
    Empleados vecEmpl[CANT_EMPLEADO] =
    {
        {3,"Juan Perez",130000},
        {1,"Pedro Gonzalez",140000},
        {5,"Arnaldo Arrazabal",100000},
        {2,"Veronica Villalba",150000},
        {8,"Gillermina Guitierrez",120000},
        {7,"Bernando Bernaudeu",100000},
        {4,"Caronila Casas",170000},
        {2,"Daniel Dado",130000}
    };

    FILE* archEmpl=fopen(NOM_ARCH_EMPL,"wb");
    if(!archEmpl)
        return -1;
    fwrite(vecEmpl,sizeof(Empleados),CANT_EMPLEADO,archEmpl);

    fclose(archEmpl);
    return 0;
}

int aumentarSueldo(const char* nomArch,const float porIncr)
{
    FILE* archEmpl=fopen(nomArch,"r+b");//w+b pisa al archivo permiten usar el fseek
    if(!archEmpl)
        return -1;
    Empleados empl;
    float porIncrProd=1+porIncr/100;
    fread(&empl,sizeof(Empleados),1,archEmpl);
    while(!feof(archEmpl))
    {
        empl.sueldo*=porIncrProd;
        fseek(archEmpl,-(long)sizeof(Empleados),SEEK_CUR);//el casteo es por que es unsigned
        fwrite(&empl,sizeof(Empleados),1,archEmpl);
        fseek(archEmpl,0L,SEEK_CUR);
        //fflush(archEmpl); No USAR
        fread(&empl,sizeof(Empleados),1,archEmpl);
    }
    fclose(archEmpl);
    return 0;
}


int mostrarEmpleados(const char* nomArch)
{
    FILE* archEmpl=fopen(nomArch,"rb");
    if(!archEmpl)
        return -1;
    Empleados empl;
    fread(&empl,sizeof(Empleados),1,archEmpl);
    while(!feof(archEmpl))
    {
        printf("%02d,%-20s,%9.2f\n",empl.legajo,empl.nombre,empl.sueldo);//el menos en %s es para alinear a la izquierda
        fread(&empl,sizeof(Empleados),1,archEmpl);
    }
    fclose(archEmpl);
    return 0;
}


int main()
{

    generarArchivoEmpleados(NOM_ARCH_EMPL);
    mostrarEmpleados(NOM_ARCH_EMPL);
    aumentarSueldo(NOM_ARCH_EMPL,10);
    mostrarEmpleados(NOM_ARCH_EMPL);
    return 0;
}

Tener en cuenta empl es una variable de tipo Empleados
El nombre de la variable (empl) no es un puntero, pero su dirección de memoria se obtiene con &empl.

Por esto, en fread, se necesita &empl:
fread(&empl, sizeof(Empleados), 1, archEmpl);

Porque fread debe escribir los bytes leídos desde el archivo dentro de empl, es decir, necesita saber dónde guardarlos → se pasa la dirección de la variable.

En cambio, en fwrite, ya es un puntero

fwrite(vecEmpl, sizeof(Empleados), CANT_EMPLEADO, archEmpl);

vecEmpl es un array de estructuras Empleados.