Tengo el siguiente problema... este es mi código para ingresar unas calificaciones y que te muestre el promedio, cuando lo ingreso si lo guarda en el archivo y hasta puedo ver lo que contiene eligiendo la segunda opción del menú. El problema es cuando cierro el ejecutable y vuelvo a ejecutarlo y le doy leer, se traba. ¡Ayuda!
#include <stdio.h>
struct calificaciones
{
int calificaciones[13];
float promedio;
};
typedef struct calificaciones *ap_calificaciones;
void escribir_registro(FILE *arch, ap_calificaciones p, ap_calificaciones inicio)
{
int calif,i,k;
float promedio=0;
p=(ap_calificaciones) malloc (sizeof(struct calificaciones)*31);
for (i=22,inicio=p;i<25;i++,p++)
{
printf("\n PROGRAMA #%d",i+1);
for(k=0;k<13;k++)
{
printf("\n Criterio #%d",k+1);
printf("\n Calificacion: ");
scanf("%d",&calif);
//validacion
if(calif<-1 || calif>5)
{
do
{
printf("ERROR: calificacion invalida, vuelva a ingresar la calificacion: ");
scanf("%d",&calif);
}while(calif<-1 || calif>5);
}
p->calificaciones[k]=calif;
if(p->calificaciones[k]!=-1)
promedio=promedio+p->calificaciones[k];
}
p->promedio=promedio*100/65;
promedio=0;
printf("\n\n\n PROMEDIO PROGRAMA #%d: %.2f \n\n\n",i+1,p->promedio);
fwrite(&p,sizeof(p),1,arch);
}
system("pause");
system("cls");
}
void leer_registro(FILE *arch, ap_calificaciones p, ap_calificaciones inicio )
{
int i=1;
float promedio_general=0, promedio_final;
int tamanio=sizeof(p);
rewind(arch);
while (fread (&p, tamanio, 1, arch)!= 0 )
{
promedio_general=promedio_general+p->pro…
printf("\n\n\n\n PROGRAMA #%d\n Promedio: %.2f",i+22,p->promedio);
i=i+1;
}
promedio_final=promedio_general/3;
printf("\n\n\n\n\n\n PROMEDIO GENERAL: %.2f\n\n\n ",promedio_final);
system("pause");
system("cls");
}