Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么将fscanf与:while(!feof(File))一起使用2次_C_Scanf_Feof - Fatal编程技术网

为什么将fscanf与:while(!feof(File))一起使用2次

为什么将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从文件中获取数据时,会使用两次,一次在“!feof(fin)”之前,一次在后面,如下代码所示:

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");
}