在编写C语言学生信息管理系统时,想编写一个读取文本的小功能时意外遇到一个小问题。
void query()//读取文件
{
FILE *P=fopen("E:\\practise\\a.txt","r");//以读的方式打开文件
char s[1024]={0};//分配一个空间
while(!feof(P))
{
printf("%s",s);//打印出每行数据
fgets(s,sizeof(s),P);//读取下一行
}
fclose(P);
}
printf与fgets调换顺序出现不同的结果
原因
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。
现象
feof会无缘无故多执行一次,就是打印到最底层,最后一组数据,打印完没有及时结束,重新打印了一遍。上文已经修改
百度:
while(条件),当条件是真时跳出循环,先判断后执行
对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断
`while(!feof(P))//这是对的
{
printf("%s",s);//打印出每行数据
fgets(s,sizeof(s),P);//读取下一行
}`
`while(!feof(P))//这是错的
{
fgets(s,sizeof(s),P);//读取下一行
printf("%s",s);//打印出每行数据
}`
*/
参考以下资料
http://blog.csdn.net/daiyutage/article/details/8540932
http://blog.sina.com.cn/s/blog_705a5ff00101ab5d.html