(2011年真题)完成如下程序:获得男学生,女学生以及所有学生的平均年龄。学生的年龄信息保存在C:盘根目录下,文件名为student.dat,一下是部分文件信息实例。(B-Boy,G-Girl)
B 23
G 22
B 21
B 20
…
程序的输出结果参考如下形式:
Average age of Boys:21.7
Average age of Girls:21.0
Average age of All Students:21.4
第一种理解:
所给的二进制文件是文本文件转成的,就说最小单位是字符。比如说数字23 是看成 '2' '3'(显然这种理解不靠谱,但是我一开始是这么做的)
具体做法:
首先,直接更改stu.txt文件的后缀名生成二进制文件stu.dat,所以读取二进制文件到字符数组再作后续处理。 把二进制文件放在与源代码相同文件目录下。
stu.txt 内容:
B 23
G 22
B 21
B 20
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 FILE *fp; 6 char ch; 7 float BOld=0,GOld=0;//统计男女年龄总数 8 int nb=0,ng=0;//男女数 9 char buffer[100]; 10 if((fp=fopen("stu.dat","rb"))==NULL) 11 { printf("file open error!"); 12 exit(0); 13 } 14 while(fread(buffer,sizeof(char),4,fp)) 15 { 16 printf("%c%c%c%c\n",buffer[0],buffer[1],buffer[2],buffer[3]); 17 if(buffer[0]=='B') 18 {++nb; 19 BOld+=(buffer[2]-'0')*10+(buffer[3]-'0'); 20 //printf("%f,%d\n",BOld,nb); 21 } 22 else if(buffer[0]=='G') 23 {++ng; 24 GOld+=(buffer[2]-'0')*10+(buffer[3]-'0'); 25 //printf("%f\n",GOld); 26 } 27 else 28 printf("不合法"); 29 30 fread(buffer,sizeof("\n"),1,fp);//为了把每行的回车读取掉 31 } 32 33 printf("Average age of Boys:%5.1f\n",BOld/nb);//输出宽度5 保留小数1 34 printf("Average age of Girls:%5.1f\n",GOld/ng); 35 printf("Average age of All Students:%5.1f\n",(BOld+GOld)/(ng+nb)); 36 if(fclose(fp)) 37 {printf("cant close"); 38 exit(0); 39 } 40 return 0; 41 42 }
运行结果:
B 23
G 22
B 21
B 20
Average age of Boys: 21.3
Average age of Girls: 22.0
Average age of All Students: 21.5
Press any key to continue
第二种理解:
每一行都是由一个字符('B'or'G')和一个整形(int型)组成,每行行末有个回车。
具体做法:
先用以下程序生成一个符合要求的二进制文件student.dat(方法有点笨)。
1 #include<stdio.h> 2 #include<stdlib.h> 3 void main() 4 { FILE *fp; 5 char sex; 6 int old; 7 if((fp=fopen("student.dat","wb"))==NULL){ 8 printf("File open error"); 9 exit(0); 10 } 11 sex='B'; 12 old=23; 13 fwrite(&sex,sizeof(char),1,fp); 14 fwrite(&old,sizeof(int),1,fp); 15 fwrite("\n",sizeof("\n"),1,fp); 16 sex='G'; 17 old=22; 18 fwrite(&sex,sizeof(char),1,fp); 19 fwrite(&old,sizeof(int),1,fp); 20 fwrite("\n",sizeof("\n"),1,fp); 21 sex='B'; 22 old=21; 23 fwrite(&sex,sizeof(char),1,fp); 24 fwrite(&old,sizeof(int),1,fp); 25 fwrite("\n",sizeof("\n"),1,fp); 26 sex='B'; 27 old=20; 28 fwrite(&sex,sizeof(char),1,fp); 29 fwrite(&old,sizeof(int),1,fp); 30 if(fclose(fp)) 31 {printf("File close error!");} 32 }
用以下程序读取二进制文件,并处理:
1 #include<stdio.h> 2 #include<stdlib.h> 3 void main() 4 { FILE *fp; 5 char sex; 6 char buff[100]; 7 int old,nb=0,ng=0; 8 double olds_g=0,olds_b=0; 9 if((fp=fopen("D:\\程序\\file_2011_3\\student.dat","rb"))==NULL){ 10 printf("File open error"); 11 exit(0); 12 } 13 while(!feof(fp)){ 14 fread(&sex,sizeof(char),1,fp); 15 fread(&old,sizeof(int),1,fp); 16 if(sex=='B') {olds_b+=old;++nb;} 17 else if(sex=='G') {olds_g+=old;++ng;} 18 else {printf("sex error!\n");} 19 fread(buff,sizeof("\n"),1,fp);//读回车 20 } 21 printf("Average age of Boys:%5.1f\n",olds_b/nb);//输出宽度5 保留小数1 22 printf("Average age of Girls:%5.1f\n",olds_g/ng); 23 printf("Average age of All Students:%5.1f\n",(olds_b+olds_g)/(ng+nb)); 24 if(fclose(fp)) 25 {printf("File close error!"); 26 } 27 }
程序运行结果:
Average age of Boys: 21.3
Average age of Girls: 22.0
Average age of All Students: 21.5
Press any key to continue