|
发表于 2013-6-26 20:07:48
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-6-27 12:07 编辑
首先那个菜单错误的问题是因为
- #include<stdio.h>
- #include "function.h"
- #include <stdlib.h>
- int main (){
- bool begin();
- printf(" ^ v ^ [欢迎登陆运动会分数统计系统] \n");
- while (true)
- {
- if(!begin()){
-
- return 0;
- }
- }
- }
- bool begin(){
- bool ck;
- ck=true;
- printf("--------------------------------------------------------------------------------");
- printf(" 录入数据:a | 打印各学校成绩单: b | 打印团体总分报表 : c | 退出系统 : q\n");
- printf("--------------------------------------------------------------------------------");
- char ch;
- //getchar();
- __Error:
- scanf("%c",&ch);
- switch (ch)
- {
- case 'a' :
- {
- add();
- flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 default:,于是出现菜单错误
- break;
- }
- case 'b' :
- {
- pr_ge();
- flushall();
- break;
- }
- case 'c' :
- {
- pr_tuan();
- flushall();
- break;
- }
- case 'q' :
- {
- ck=false;
- flushall();
- break;
- }
-
- default:
- printf("菜单选择错误");goto __Error;break;
- }
- return ck;
- }
复制代码
flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 default:,于是出现菜单错误
至于为什么会打印出11个N的话,在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个
修改
- int pr_ge(){
- FILE *fpr ,*fpw;
- if((fpr=fopen("allsz.dat","rb"))==NULL) {printf("由于您未录入数据,打开数据文件失败!\n"); return 0;}
- fread(&person_result,sizeof(s_person_result),1,fpr);
- while(!feof(fpr)){
- if(!strcmp(person_result.schoolnumber,"2"))
- printf("%s,%s,%s,%s,%s,%f\n",person_result.playernumber,person_result.
- schoolnumber,person_result.projectnmber,person_result.sex,person_result.type,person_result.score);
- printf("n\n");
- fread(&person_result,sizeof(s_person_result),1,fpr);
- }
复制代码
至于为什么不会打印信息
if(!strcmp(person_result.schoolnumber,"2"))
这个语句的意思应该是如果学校编号是2就不打印吧?
关键是fread用错了
从上图你可以看出fread并不是那么智能的
它不会判断,只会满足你每个成员大小的要求
比如第一个成员你设置[5],那么它就会不加判断直接找5个塞进去
也就是不满足你的赋值要求啦,你自己改吧,伤。
就是自己判断了,用逗号来判断一个成员结束就行
|
|