为什么将fscanf与:while(!feof(File))一起使用2次
为什么在使用fscanf从文件中获取数据时,会使用两次,一次在“!feof(fin)”之前,一次在后面,如下代码所示:为什么将fscanf与:while(!feof(File))一起使用2次,c,scanf,feof,C,Scanf,Feof,为什么在使用fscanf从文件中获取数据时,会使用两次,一次在“!feof(fin)”之前,一次在后面,如下代码所示: fscanf(fin, "%s", letta); while(!feof(fin)){ fscanf(fin, "%s", letta); } “读取”一词不一样?否“读取”一词不一样,因为您从文件中读取了两次,每次都会得到不同的数据 while中的条件测试您是否在文件末尾,为此必须进行读取尝试,这需要在循环之前执行fscanf() 一旦进入循环,就要继续读取文件
fscanf(fin, "%s", letta);
while(!feof(fin)){
fscanf(fin, "%s", letta);
}
“读取”一词不一样?否“读取”一词不一样,因为您从文件中读取了两次,每次都会得到不同的数据
while
中的条件测试您是否在文件末尾,为此必须进行读取尝试,这需要在循环之前执行fscanf()
一旦进入循环,就要继续读取文件。大概在循环中会有更多的代码来处理您正在读取的数据
在您发布的代码中,如果第一次尝试读取时遇到文件结尾,则不会进入(while
)循环
将此与测试位于循环底部的
do while
构造进行对比(即读取仅在循环的“底部”发生一次)。在这里,您至少会进入循环一次。像这样使用feof()
可能没有任何意义,但是许多正在学习C的人(我想,如果我弄错了,请道歉)似乎“想要”
事实上,fscanf()
本身有一个返回值;如果文件结束,它将无法执行请求的扫描,并且它会告诉您这一点。如果文件结束,它甚至会返回特殊常量EOF
。因此,只需在fscanf()的返回值上循环:
因为EOF标志仅在调用fscanf
后设置。当尚未调用fscanf
时,while(!feof(fin))
的条件就没有意义了。feof
在您尝试读取文件末尾之前不会返回true。设想一个如下所示的文件:
This is a test$
^
在循环的三次迭代(读取“is”、“a”和“test”)之后,您得到了以下结果:
This is a test$
^
没错,没错,但这并不能直接回答问题。这不是使用feof的正确方法:
This is a test$
^
This is a test$
^
errno = 0;
while (fscanf(fin, "%s", letta) == 1)
{
// process letta
}
if (feof(fin))
{
printf("Reached end of file\n");
}
else
{
perror("Error on read");
}