我打开了一个文件,流被找到在指针ptr
的地址上。我试图查看文件是否为空。使用以下代码:
if (fgetc(ptr) != EOF)
正常工作。当文件为空时,语句不会被执行。当文件不为空时,语句也不会被执行。
然而,使用
if (!feof(ptr))
始终执行该语句。
为什么会发生这种情况?有没有办法使用 feof
函数?
我打开了一个文件,流被找到在指针ptr
的地址上。我试图查看文件是否为空。使用以下代码:
if (fgetc(ptr) != EOF)
正常工作。当文件为空时,语句不会被执行。当文件不为空时,语句也不会被执行。
然而,使用
if (!feof(ptr))
始终执行该语句。
为什么会发生这种情况?有没有办法使用 feof
函数?
有没有一种方法可以使用
feof
函数?
是的,有。在输入函数返回指示它没有更多输入要处理的值之后,您可以调用 feof()
和/或 ferror()
以确定该条件是否是由于到达输入结束还是某些错误条件导致的。
这是 feof()
和 ferror()
函数的唯一有效用法。
指示没有更多输入剩余的结果因函数而异。例如,fgetc()
返回值为 EOF
,fgets()
返回空指针,fread()
返回小于所请求记录数的某个值。您需要阅读每个输入函数的文档以了解其工作原理。
fread
返回少于请求的数据时,这只表示相当于EOF的情况,当返回0时。 - Weather Vaneread()
吗?引用C标准:“**fread
函数返回成功读取的元素数量,如果遇到读取错误或文件结束,则可能小于nmemb
**。” - Keith Thompsongetchar
返回的EOF,因为getchar
试图读取超出文件末尾的内容。也许我只是在挑刺。 - Weather Vanefread()
的工作方式就像重复调用 fgetc()
。如果您请求 fread()
读取,比如说,10 条记录,但它只返回了 5 条,那么这意味着它尝试并未能读取第 6 条记录,可能是因为出现了错误或者已经到达了输入流的末尾。 - Keith Thompsonfgetc
返回EOF; fgets
返回空指针; fread
返回<N。 - dave_thompson_085fgetc() == EOF
,这可能意味着已经到达了文件结尾或者出现了某种读取错误。可以使用 feof()
来确认是否是因为文件结束导致了失败。这应该是它唯一的目的。 - chqrliefeof(f)
函数返回的总是false,因为在你打开文件后,该函数会给你一个已初始化为false的标记(flag)的值。只有在至少一次读取操作失败之后,该标记才会被设置为true。
feof
:fgetc(fp);
if (feof(fp))
...
feof
函数用于检查文件指针位置是否已到达文件结尾,如果是则返回非零值。对于那些你无法控制的读取文件的代码而言,该函数能够帮助你判断何时停止处理。
feof()
。使用if (fgetc(fp) == EOF)
有什么问题吗? - chqrliefgetc
返回 EOF 表示任何错误条件,但是 feof
只检查文件结束的特定条件。因此,如果存在读取错误但文件未结束,则您的代码将继续对虚假数据进行操作。 - M.Mfeof
的作用,但并不一定认可它在特定情况下的使用。最后一句话是重点,解释了为什么feof
实际上很有用,这对OP来说并不明显。 - user4815162342feof
被普遍误用,我们仍然可以向初学者解释它的作用。OP明确地询问如何使用feof
,而答案对此进行了解释。除了您对feof
的普遍反感外,答案还存在其他问题吗? - user4815162342虽然回答晚了,但是我想引用 Stephen Kochan 在他的书 Programming in C (第四版) 第367页中的一句话来帮助你:
记住,
feof()
告诉你已经尝试读取超过文件末尾,这与告诉你刚刚读取了文件的最后一个数据项是不同的。你必须再读取一次最后一个数据项,才能使feof()
返回非零值。
以上为个人意见。