二进制文件读取

(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

 

转载于:https://www.cnblogs.com/yexinyu/p/6044434.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值