检测“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
检查中)进行比较.
在 <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
检查中)进行比较.