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.