检测“fseek()”何时超出文件末尾

Detect when `fseek()` goes beyond end of file

<stdio.h> 中,函数 fseek() 似乎允许跳过超出其文件处理程序末尾的方式,而不会产生任何错误代码。

虽然我可以理解当 FILE* 处理程序设置为 "w" 写入时的行为,因为它似乎允许写入稀疏文件,但我不明白这种功能的意义它是 "r" 只读的。

无论如何,因此无法检测到文件末尾被 fseek() 超出,下次尝试 fread() 只需 returns 0,就好像正常到达文件末尾一样。

有什么变通方法可以检测到 fseek() 超过文件末尾?

... I don't understand the point of such a feature when it's "r" read-only.

我认为这不是预期的功能,但我认为在操作系统中(而不是在 C 库中)更容易实现此行为。

而且如果你不在fseek()之后立即调用fread(),另一个程序可能会在两次函数调用之间向文件追加数据,所以新的文件指针不再在结束之后调用 fseek().

时的文件

(我刚刚检查过这在 Linux 下确实有效,我认为它在 Windows 和 MacOS 下也能正常工作。)

What could be a work around to detect that fseek() overshot past the end of file?

您可以通过使用 fseek(..., 0, SEEK_END); 将文件指针设置为末尾并使用 ftell().

读取文件指针来检查文件大小

然后您知道文件的大小,并且可以将新文件指针(您传递给 fseek())与“手动”文件的大小(在 if()...else 检查中)进行比较.