fichero binario que calcula la media
Hola, el siguiente ejercicio consiste en crear un fichero binario e ir almacenando en él los N registros con los apellidos, el nombre y la nota de los alumnos. Para ello realizamos la operación de escritura sobre el fichero binario para guardar esos datos. Una vez hecho esto hay que hacer la operación de lectura sobre el fichero binario para calcular la media y saber los alumnos que estań por encima de la media. a la hora de compilar tiene que salir los apellidos, el nombre y la nota de aquellos alumnos que están por encima de la media.
1.
#include <stdlib.h>
2.
#include <stdio.h>
3.
4.
struct alumno{
5.
char nom[20];
6.
char apell1[50];
7.
char apell2[50];
8.
double nota;
9.
};
10.
#define LEE_CAD(c,t){int i=0;
11.
c=getchar();
12.
while((c=='n')||(c=='t')) c=getchar();
13.
while((c!='n')&&(i<(t-1))){
14.
i++;
15.
c=getchar();}
16.
c=' ';}
17.
18.
#define lee_char(c) { c=getchar();
19.
while((c==' ')||(c=='n'))
20.
c=getchar();}
21.
22.
int main(){
23.
24.
void alta_alumno(const char[]);
25.
double media(const char[]);
26.
void mostrar_mayores_media(const char[], double);
27.
28.
alta_alumno("notas.txt");
29.
mostrar_mayores_media("notas.txt", media("notas.txt"));
30.
exit(0);
31.
}
32.
33.
void alta_alumno(const char nom_fich[]){
34.
35.
FILE *pf;
36.
char otro;
37.
struct alumno al;
38.
39.
if((pf = fopen(nom_fich, "wb")) == NULL){
40.
perror("Error al abrir el fichero alumnosn");
41.
exit(1);
42.
}
43.
44.
do{
45.
printf("Dame los dos apellidos, nombre y nota:");
46.
scanf("%49s %49s %19s %lf", al.apell1, al.apell2, al.nom, &al.nota);
47.
48.
fwrite(&al, sizeof(al), 1, pf);
49.
50.
printf("¿Otro alumno?(s/n) ");
51.
lee_char(otro);
52.
}while((otro == 's') || (otro == 'S'));
53.
54.
if(fclose(pf) == EOF){
55.
printf("Error al cerrar el fichero de alumnosn");
56.
exit(2);
57.
}
58.
}
59.
60.
double media(const char nom_fich[]){
61.
62.
FILE *pf;
63.
double res=0.0;
64.
int num_alumnos=0;
65.
struct alumno al;
66.
if((pf = fopen(nom_fich, "rb")) == NULL){
70.
perror("Error al abrir el fichero de alumnosn");
71.
exit(3);
72.
}
67.
fread(&al, sizeof(al), 1, pf);
68.
while(!feof(pf)){
74.
res=res + al.nota;
75.
num_alumnos++;
76.
fread(&al, sizeof(al), 1, pf);
77.
}
78.
fclose(pf);
79.
res=res/(double)num_alumnos;
80.
return(res);
81.
}
82.
83.
void mostrar_mayores_media(const char nom_fich[], double m){
84.
85.
FILE *pf;
86.
struct alumno al;
87.
double media(const char[]);
88.
m=media(nom_fich);
89.
90.
if((pf = fopen(nom_fich, "rb")) == NULL){
91.
perror("Error al abrir el fichero de alumnosn");
92.
exit(4);
93.
}
94.
fread(&al, sizeof(al), 1, pf);
95.
while(!feof(pf)){
96.
if(al.nota >= m)
97.
printf("%s %s %s %.2lfn", al.apell1, al.apell2, al.nom, al.nota);
98.
99.
fread(&al, sizeof(al), 1, pf);
100.
}
101.
fclose(pf);
102.
}
El problema que tengo es cuando voy al escritorio e intento abrir el fichero binario alumnos.dat que he creado no me deja y me aparece el siguiente mensaje: No se pudo mostrar «/home/mikel/Escritorio/alumnos.dat». El archivo es de un tipo desconocido. Tu sabrías decirme por qué me pone esto y cómo puedo solucionarlo para que me deje ver el contenido del fichero binario. Utilizo Ubuntu, si sirve de algo.Gracias.
1.
#include <stdlib.h>
2.
#include <stdio.h>
3.
4.
struct alumno{
5.
char nom[20];
6.
char apell1[50];
7.
char apell2[50];
8.
double nota;
9.
};
10.
#define LEE_CAD(c,t){int i=0;
11.
c=getchar();
12.
while((c=='n')||(c=='t')) c=getchar();
13.
while((c!='n')&&(i<(t-1))){
14.
i++;
15.
c=getchar();}
16.
c=' ';}
17.
18.
#define lee_char(c) { c=getchar();
19.
while((c==' ')||(c=='n'))
20.
c=getchar();}
21.
22.
int main(){
23.
24.
void alta_alumno(const char[]);
25.
double media(const char[]);
26.
void mostrar_mayores_media(const char[], double);
27.
28.
alta_alumno("notas.txt");
29.
mostrar_mayores_media("notas.txt", media("notas.txt"));
30.
exit(0);
31.
}
32.
33.
void alta_alumno(const char nom_fich[]){
34.
35.
FILE *pf;
36.
char otro;
37.
struct alumno al;
38.
39.
if((pf = fopen(nom_fich, "wb")) == NULL){
40.
perror("Error al abrir el fichero alumnosn");
41.
exit(1);
42.
}
43.
44.
do{
45.
printf("Dame los dos apellidos, nombre y nota:");
46.
scanf("%49s %49s %19s %lf", al.apell1, al.apell2, al.nom, &al.nota);
47.
48.
fwrite(&al, sizeof(al), 1, pf);
49.
50.
printf("¿Otro alumno?(s/n) ");
51.
lee_char(otro);
52.
}while((otro == 's') || (otro == 'S'));
53.
54.
if(fclose(pf) == EOF){
55.
printf("Error al cerrar el fichero de alumnosn");
56.
exit(2);
57.
}
58.
}
59.
60.
double media(const char nom_fich[]){
61.
62.
FILE *pf;
63.
double res=0.0;
64.
int num_alumnos=0;
65.
struct alumno al;
66.
if((pf = fopen(nom_fich, "rb")) == NULL){
70.
perror("Error al abrir el fichero de alumnosn");
71.
exit(3);
72.
}
67.
fread(&al, sizeof(al), 1, pf);
68.
while(!feof(pf)){
74.
res=res + al.nota;
75.
num_alumnos++;
76.
fread(&al, sizeof(al), 1, pf);
77.
}
78.
fclose(pf);
79.
res=res/(double)num_alumnos;
80.
return(res);
81.
}
82.
83.
void mostrar_mayores_media(const char nom_fich[], double m){
84.
85.
FILE *pf;
86.
struct alumno al;
87.
double media(const char[]);
88.
m=media(nom_fich);
89.
90.
if((pf = fopen(nom_fich, "rb")) == NULL){
91.
perror("Error al abrir el fichero de alumnosn");
92.
exit(4);
93.
}
94.
fread(&al, sizeof(al), 1, pf);
95.
while(!feof(pf)){
96.
if(al.nota >= m)
97.
printf("%s %s %s %.2lfn", al.apell1, al.apell2, al.nom, al.nota);
98.
99.
fread(&al, sizeof(al), 1, pf);
100.
}
101.
fclose(pf);
102.
}
El problema que tengo es cuando voy al escritorio e intento abrir el fichero binario alumnos.dat que he creado no me deja y me aparece el siguiente mensaje: No se pudo mostrar «/home/mikel/Escritorio/alumnos.dat». El archivo es de un tipo desconocido. Tu sabrías decirme por qué me pone esto y cómo puedo solucionarlo para que me deje ver el contenido del fichero binario. Utilizo Ubuntu, si sirve de algo.Gracias.
-Prueba a abrir "alumnos.dat" desde un editor de texto (como Gedit o Vim)
Hola, trabajo con el editor de texto gedit en Ubuntu, lo he intentado abrir, pero me aparece el siguiente mensaje:
No se pudo abrir el archivo /home/mikel/Escritorio/alumnos.dat.
gedit no ha podido detectar la codificación de caracteres.
Compruebe que no está intentando abrir un archivo binario.
Seleccione una codificación de caracteres desde el menú e intente de nuevo.
Codificación de caracteres: Configuración regional actual (UTF-8)
Estoy desesperada he intentado en otro foro, pero no he logrado resolver el problema, llevo varios días con el mismo problema. A ver si alguien puede ayudarme. Gracias.
No se pudo abrir el archivo /home/mikel/Escritorio/alumnos.dat.
gedit no ha podido detectar la codificación de caracteres.
Compruebe que no está intentando abrir un archivo binario.
Seleccione una codificación de caracteres desde el menú e intente de nuevo.
Codificación de caracteres: Configuración regional actual (UTF-8)
Estoy desesperada he intentado en otro foro, pero no he logrado resolver el problema, llevo varios días con el mismo problema. A ver si alguien puede ayudarme. Gracias.