Hola, estoy haciendo un programa de prueba en el cual creo un archivo binario, despues lo leo y hago unos calculos.El programa es el siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
struct datos{
char nombre[30];
unsigned int nota1;
unsigned int nota2;
};
struct datos alumnos[50];
int n;
printf("Ingrese la cantidad de alumnos del curso:\n");
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
printf("\nIngrese el apellido del alumno %d:\n",i);
scanf("%s",alumnos.nombre);
fflush(stdin);
printf("\nIngrese la nota del modulo 1 del alumno %d:\n",i);
scanf("%u",&alumnos.nota1);
fflush(stdin);
printf("\nIngrese la nota del modulo 2 del alumno %d:\n",i);
scanf("%u",&alumnos.nota2);
fflush(stdin);
}
FILE *pf;
pf=fopen("alumnos.dat","wb");
if(pf==NULL)
{
printf("Error al abrir el archivo");
exit(1);
}
fwrite(alumnos,sizeof(struct datos),n,pf);
if(fclose(pf)!=0)
{
printf("Error al cerrar el archivo");
exit(1);
}
pf=fopen("alumnos.dat","rb");
if(pf==NULL)
{
printf("Error al abrir el archivo para lectura");
exit(1);
}
fseek(pf,0l,SEEK_SET);
struct copia{
char nombre[30];
unsigned int nota1;
unsigned int nota2;
};
struct copia lectura[50];
int cant_alumnos=0;
i=0;
while(!feof(pf))
{
fread(&lectura,sizeof(struct copia),1,pf);
printf("\n\nNombre del alumno:%s\nnota1:%u\nnota2:%u",lectura.nombre,lectura.nota1,lectura.nota2);
cant_alumnos++;
i++;
}
float promedio;
float promedio_max=0;
char nombre_max[30];
int j;
for(i=0;i<cant_alumnos;i++)
{
promedio=((lectura.nota1)+(lectura.nota2))/2;
if(promedio>promedio_max)
{
for(j=0;j<30;j++)
{
nombre_max[j]='\0';
}
promedio_max=promedio;
strcpy(nombre_max,lectura.nombre);
}
}
if(fclose(pf)!=0)
{
printf("Error al cerrar el archivo para lectura");
exit(1);
}
printf("\n\nEl alumno del mejor promedio es %s y el promedio es %.2f",nombre_max,promedio_max);
return 0;
}
Mi problema es que cuando entra en el bucle del while(!feof(pf)) hace una pasada de mas y lee un dato que no tendria que hacerlo. Porfavor, espero una pronta solucion. saludos.