关于feof函数多读一次的问题

本文探讨了在从文件中读取数据时遇到的一个常见问题:读取完成后额外读出一个0值。通过调试和代码优化,作者分享了解决方案,并解释了feof()和EOF在文件读取中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在完成通信录的过程中总是多读出一个0,对此我进行了多次调试。

下面是成功的代码

void load_txl(Link *head)
{
Link temp = *head;
Link newnode = NULL;
FILE *fp;
int i;


if((fp = fopen("txl.txt","r")) == NULL)
{
printf("打开失败!\n");
exit(-1);



//fseek(fp,0,SEEK_END);
//len = ftell(fp);
fseek(fp,0,SEEK_SET);




    /*newnode = (Link)malloc(sizeof(Txl));
fread(newnode,sizeof(Txl),1,fp);
printf("%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,newnode->age,newnode->tele,newnode->addr);*/
while(!feof(fp))
{
newnode = (Link)malloc(sizeof(Txl));
   //if(fread(newnode,sizeof(Txl),1,fp) == -1)
//{
// printf("Error!\n");
// exit(-1);
//}


   if(fread(newnode,sizeof(Txl),1,fp) == 0)
{
break;
}


printf("%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,newnode->age,newnode->tele,newnode->addr);


//j = fscanf(fp,"%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,&newnode->age,newnode->tele,newnode->addr);
temp->next = newnode;
newnode = NULL;
temp = temp->next;
}
if(feof(fp))
{
free(newnode);
newnode = NULL;
}
fclose(fp);


}

注释部分是我进行的探索,是我的思路历程,其实只要对其返回值进行判断即可。

原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。feof()可以用EOF代替吗?不可以。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值