我只是使用以下语句读取字符串:
fgets(string, 100, file);
刚读入的这个字符串是最后一行。如果我现在拨打feof()
它会返回TRUE吗?是否与在阅读任何行之前在开始时调用feof()
相同?
答案 0 :(得分:3)
阅读过去数据结尾时,feof()在最后一行读完后调用了吗?
没有
feof()
成为现实。如果最后一行以'\n'
结束,则读取最后一行可能无法通过数据结尾。
答案 1 :(得分:2)
不,请勿使用feof()
来检测文件的结尾。而是检查读取失败,例如fgets()
如果尝试读取文件末尾将返回NULL
,而feof()
将返回0
,直到某些函数尝试读取超过文件末尾,之后才返回非零值。
答案 2 :(得分:2)
简短的回答是否。原因如下:
如果fgets
成功读取了行尾的'\n'
,则FILE
结构中的文件结束指示符尚未设置。因此,feof()
将返回0
,就像在阅读任何内容之前一样,即使在空文件上也是如此。
feof()
只能在输入操作失败后用于区分文件结束和读错误条件。同样,ferr()
可用于在输入操作失败后检查读取错误。
程序员通常会忽略文件结束和读取错误之间的区别。因此,它们仅依赖于检查输入操作是成功还是失败。因此,他们从不使用feof()
,你也应该这样做。
行为与errno
的行为有些相似:errno
由某些库函数设置,以防出现错误或失败。成功后,它不会重置为0
。在函数调用之后检查errno
仅在操作失败时才有意义和如果errno
在函数调用之前被清除为0
。
如果要检查是否确实已到达文件,则需要尝试读取额外输入。例如,您可以使用此功能:
int is_at_end_of_file(FILE *f) {
int c = getc(file);
if (c == EOF) {
return 1;
} else {
ungetc(c, file);
return 0;
}
}
但是,如果从控制台读取,读取额外输入可能不值得:它将要求用户输入将保留在输入流中的额外输入。如果从管道或设备读取,副作用可能更成问题。唉,没有可移植的方法来测试FILE
流是否与实际文件相关联。