C语言中的feof函数
fq=(fopen("date.txt","r"));for(i=0;!feof(fq);i++)fscanf(fq,"%s%f%f\n",day[i].date,&da...
fq=(fopen("date.txt","r"));
for(i=0;!feof(fq);i++)
fscanf(fq,"%s %f %f\n",day[i].date,&day[i].boa,&day[i].mis);
我这个文件data.txt开始是空的,但是读入的时候feof第一次循环还是做了,不明白,feof不是到文件末尾就停了吗?而且,当data.txt文件中有一次的保存结果的时候,循环还是只做一次,这是什么问题,求解? 展开
for(i=0;!feof(fq);i++)
fscanf(fq,"%s %f %f\n",day[i].date,&day[i].boa,&day[i].mis);
我这个文件data.txt开始是空的,但是读入的时候feof第一次循环还是做了,不明白,feof不是到文件末尾就停了吗?而且,当data.txt文件中有一次的保存结果的时候,循环还是只做一次,这是什么问题,求解? 展开
1个回答
展开全部
即使文件是空的,也要再读一次,feof函数值才会变为真。
因为只有读出所有的数据之后,再读一次,函数feof(fp)的返回值才为真。(请见《C语言好程序设计—从入门到进阶》,人民邮电出版社,2011。)
示例:
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE *fp;
int a;
if((fp=fopen("c:\\number.txt","r"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d",&a);
while(!feof(fp)) /*等价于while(feof(fp)==0)*/
{
printf("%d ",a);
fscanf(fp,"%d",&a);
}
fclose(fp);
}
因为只有读出所有的数据之后,再读一次,函数feof(fp)的返回值才为真。(请见《C语言好程序设计—从入门到进阶》,人民邮电出版社,2011。)
示例:
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE *fp;
int a;
if((fp=fopen("c:\\number.txt","r"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d",&a);
while(!feof(fp)) /*等价于while(feof(fp)==0)*/
{
printf("%d ",a);
fscanf(fp,"%d",&a);
}
fclose(fp);
}
更多追问追答
追问
如果按你的说法,那有一条数据,就按我的那个循环来讲,循环应该做两次,但我测试的结果为1次,解释不通啊
追答
请看以下程序,应该这样读出。若用你原来的方法,文件为空时,会输出乱字符。
还有你的fscanf中多了一个\n。
#include
#include
main()
{
FILE *fq;
int i;
char date[80]; //为了简单,去掉了结构体
float boa,mis;
fq=(fopen("c:\\date.txt","r"));
fscanf(fq,"%s",date);
for(i=0;!feof(fq);i++)
{fscanf(fq,"%f%f",&boa,&mis);
printf("%s %f %f\n",date,boa,mis);
fscanf(fq,"%s",date);
}
fclose(fq);
}
刚才那本书的名字应该是《C语言程序设计—从入门到进阶》,人民邮电出版社,2011。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询