为什么使用fscanf从文件中获取数据时,会使用两次,一次是在"!feof(fin)“之前,一次是在后面,如以下代码所示:
fscanf(fin, "%s", letta);
while(!feof(fin)){
fscanf(fin, "%s", letta);
}读的词不是一样的吗?
发布于 2012-06-20 20:51:03
不,读取的单词不会相同,因为您从文件中读取了两次,每次都会得到不同的数据。
while中的条件测试您是否在文件末尾,为此必须进行读取尝试,这需要在循环之前使用fscanf()。
进入循环后,您希望继续从文件中读取数据。大概在循环中会有更多的代码来处理您正在读取的数据。
在您发布的代码中,如果您在第一次读取尝试时遇到文件末尾,则不会进入(while)循环。
这与测试位于循环底部的do-while构造形成对比(即读取只发生一次,在循环的“底部”)。在那里,您将始终至少进入循环一次。
发布于 2012-06-20 20:57:53
在这里使用这样的feof()可能没有意义,但是许多正在学习C的人(我想,如果我弄错了,很抱歉)似乎“想要”。
事实上,fscanf()本身有一个返回值;如果文件结束,它将无法执行请求的扫描,并且它会告诉您。如果文件结束,它甚至会返回特殊常量EOF。所以只需循环fscanf()的返回值
while( fscanf(fin, "%s", letta) == 1 )
{
/* Process, parse, store or do whatever with letta. */
}发布于 2012-06-20 20:59:28
因为EOF标志仅在调用fscanf之后设置。当还没有调用fscanf时,条件while(!feof(fin))就没有意义了。
https://stackoverflow.com/questions/11119942
复制相似问题