为什么读写文件多读出一个?

typedefstructxx{unsignedinta;charc;}x;intmain(){FILE*pt=fopen("test.txt","wb+");xx1;x... typedef struct xx{ unsigned int a; char c;}x;int main(){ FILE *pt = fopen("test.txt","wb+"); x x1; x1.c = '|'; x1.a = 8; fwrite(&x1,sizeof(x),1,pt); x1.a = 16; fwrite(&x1,sizeof(x),1,pt); x1.a = 32; fwrite(&x1,sizeof(x),1,pt); x1.a = 64; fwrite(&x1,sizeof(x),1,pt); fclose(pt); return 0;}上述程序向文件写数据下面程序读数据:typedef struct xx{ unsigned int a; char c;}x;int main(){ FILE *pt = fopen("test.txt","rb+"); x x1; while(feof(pt) ==0){ fread(&x1,sizeof(x),1,pt); printf("%d ",x1.a); } fclose(pt); return 0;}为什么读出来的是8 16 32 64 64问什么多读出来一个64 展开
 我来答
风若远去何人留
2013-11-18 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450134
专业C/C++软件开发

向TA提问 私信TA
展开全部
int main()
{
FILE *pt = fopen("test.txt","rb+");

x x1;
int ret;
while(feof(pt) ==0)
{
ret = fread(&x1,sizeof(x),1,pt);
printf("read %d\n", ret);
printf("%d ",x1.a);
}
fclose(pt);
return 0;
}

把read部分改成这样你可能就明白了
最后一次read到64时,由于读是成功的,所以feof判断会是false 但实际上这时已经没有数据了,下一次fread什么都没有读到,于是值还是上次的值
要想消除这个bug 那就不要使用feof 这个函数判断很鸡肋

可以
int main()
{
FILE *pt = fopen("test.txt","rb+");

x x1;
int ret;
while(fread(&x1,sizeof(x),1,pt) == 1)
printf("%d ",x1.a);
fclose(pt);
return 0;
}
追问
想了一下,改成这样也行:
ret = fread(&x1,sizeof(x),1,pt);
while(feof(pt) ==0)
{
printf("read %d\n", ret);
printf("%d ",x1.a);
ret = fread(&x1,sizeof(x),1,pt);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式