C语言将数据写入文件,读取出现二次读取

出现的问题就在我画红线的地方。
*****以写的方式保存数据到文件的函数【原数据将被覆盖】*****/
int save(int n) //保存函数,保存n个记录
{
FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","wb"))==NULL)//以二进制写的方式打开,在此前的记录被覆盖
{
printf("无法打开文件!\n任意键退出程序... ...\n");
getch(); //预防闪屏
return 0;
}
for(i=0;i<n;i++)
if(per[i].f_num!=0) //在后面的del()函数中通过将stu[i].ave=0来表示该记录被删除了
if(fwrite(&per[i],sizeof(struct person),1,fp)!=1)//开始写入文件
printf("文件写入发生错误\n");
fclose(fp);
return 0; // 注意下这个地方 ,我只是随便赋的值,只是为了消除一个警告
}
/***【加载记录或可以计算记录个数的函数】***/
int load()
{
FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","rb"))==NULL) //以二进制读的方式打开
{
printf("无法打开文件!\n任意键退出程序... ...\n"); //显示不能打开文件的信息
getch(); //预防闪屏
return 0;
}
for(i=0;!feof(fp);i++)
fread(&per[i],sizeof(struct person),1,fp); //将文件数据读入学生结构体
fclose(fp);
return(i-1); //返回目前总的记录个数,注意是i-1
}
大神给点建议,是哪儿出现问题了,如果要源程序的话我也可以共享!
person结构体
typedef struct person
{
char number[4]; //序号
char ymd[10]; //来访日期
char v_name[10]; //来访人姓名
char cre_name[10]; //来访人证件名
char c_num[18]; //来访人证件编号
char bv_name[10]; //被访人姓名
double f_num; //被访人楼号
char hm_start[5]; //来访时间
char hm_leave[5]; //离开时间
char desc[20]; //备注
}PER;
PER per[N]; //定义一个外部结构体变量

不要用feof在循环里判断,在读到文件最后一个字节时,feof(fp)还是为0值,再试图读文件时,feof(fp)才为非0值来报错,所以会多读一次
用fread的返回结果判断就行了,0就是没数据了

for(i=0;!feof(fp);i++)
    fread(&per[i],sizeof(struct person),1,fp);
改成
i=0;
while (fread(&per[i],sizeof(struct person),1,fp))
    i++;追问

还是不行哎。。大哥,改完以后还是输出这个结果。。。

追答

return(i-1); //返回目前总的记录个数,注意是i-1
不用-1了,直接return i

追问

大哥,不行的,

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-01
提供一下你的person结构体,估计变量定义有问题追问

我把person结构体补充到上面了,这边写不下。。。麻烦您咯。。

追答

char ymd[10]; //来访日期 你存储的数据如果是2014/07/02则说明有效数据是10个,而作为一个字符串,应该还要有一位结束符位('\0'),因此,应该改为char ymd[11]; //来访日期,比有效数据多一个才好!
其他地方的字符串也要注意这个问题。
祝进步

追问

大哥还是不对啊,我都改了,依旧是原来的样子

追答

重新保存你的数据文件,再重新读数据才可以!

追问

谢谢咯,还是不行

追答

共享完整代码,你这程序就这两个问题,一个是楼下说的多读了一行空数据,所以出现了2和NULL
另一个,就是你变量定义的问题,导致输出的日期后面有附加数据。

相似回答