C/Visual C - Ayuda con programa en C (archivo binario)

 
Vista:

Ayuda con programa en C (archivo binario)

Publicado por anaceci (1 intervención) el 28/05/2013 23:05:00
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!




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#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");
}
 
 
 
 
int main()
{
FILE *arch;
int opcion;
ap_calificaciones p, inicio;
arch=fopen("calificaciones2.dat","a+b");
if(arch!=NULL)
{
do
{
printf("\n 1) Dar de alta las calificaciones \n 2) Ver listado de calificaciones\n 0) Salir\n ");
scanf("%i", &opcion);
system("cls");
switch(opcion)
{
case 1:
escribir_registro(arch,p,inicio);
break;
case 2:
leer_registro(arch,p,inicio);
break;
case 0:
fclose(arch);
break;
}
}while (opcion);
}
else
printf("\n Error al abrir el archivo");
fclose(arch);
system("pause");
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con programa en C (archivo binario)

Publicado por Tom (619 intervenciones) el 30/05/2013 18:34:16
Por si acaso

while (fread (&p, tamanio, 1, arch) == 1) { ... }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con programa en C (archivo binario)

Publicado por Chema (234 intervenciones) el 31/05/2013 01:40:43
Añade; abre o crea un fichero en modo binario para actualización, escribiendo al final del fichero (EOF)
arch=fopen("calificaciones2.dat","a+b");


Abre un fichero en modo binario para actualización (lectura y escritura)
arch=fopen("calificaciones2.dat","r+b ");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar