首页 > 编程知识 正文

feof函数的用法,feof(fp)函数用来判断文件是否结束

时间:2023-05-05 07:48:03 阅读:261527 作者:3083

feof的使用不当会出现的问题

写读取文件的代码,喜欢直接使用while(0==feof(frp))来判断文件是否执行到末尾,如果frp指向的文件有内容的话,feof可以正确判断是否执行到末尾,但是如果文件为空,则会进入死循环,这个问题困扰了我很久。
例如:

void read_tchfile(void) { FILE *frp=fopen("tch.txt","r"); if(NULL==frp) return ; while(0 == feof(frp)) {fscanf(frp,"姓名:%s 性别:%s 工号:%sn是否在校:%h hd 是否登录:%hhd 是否锁定:%hhdn",tch[num].name,tch[num].sex,tch[num].id,&tch[num].on_job,&tch[num].login,&tch[num].lock); num++; } fclose(frp); return; }

如果读取的tch.txt文件为空,就会进入死循环。

feof判断是否执行到文件末尾的原理(大概)

看了一些关于feof原理的博客,自己总结出来的关于feof原理暂定的说法:
feof会读取文件的文件结束符,但是是通过前后查找的方式。
比如你的指针指向10地址,feof会去9和11里面查找文件结束符而不会在10中查找,所以当文件为空时,因为文件结束符的原因,文件里面至少存这文件结束符,文件中的指针会直接指向文件结束符,然后前后查找,找不到文件结束符,文件指针没读取到数据也不会移动,然后就陷入死循环了。

陷入死循环的解决方法

先使用getc(),从文件中读取一个字符,让光标向后移动一个字符。这时空文件的指针就已经移动到文件结束符的后面,这样前后查找就可以找到文件结束符从而跳出循环了,要注意的是,移动文件读取数据的指针后要把它移回来,可以用rewind();
例如:

`void read_tchfile(void){FILE *frp=fopen("tch.txt","r");getc(frp);if(feof(frp))return ;elserewind(frp);while(0==feof(frp)){fscanf(frp,"姓名:%s 性别:%s 工号:%sn是否在校:%hhd 是否登录:%hhd 是否锁定:%hhdn",tch[tch_num].name,tch[tch_num].sex,tch[tch_num].id,&tch[tch_num].on_job,&tch[tch_num].login,&tch[tch_num].lock);tch_num++;}fclose(frp);return;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。