C fseek在EOF之外的位置不会使用feof触发EOF,为什么?
我正在将文件中的数据读取到内存中,该内存是通过以下方式打开的:C fseek在EOF之外的位置不会使用feof触发EOF,为什么?,c,linux,io,eof,fseek,C,Linux,Io,Eof,Fseek,我正在将文件中的数据读取到内存中,该内存是通过以下方式打开的: FILE *f = fopen(path, "rb"); 在开始从文件复制字节之前,我将使用以下命令搜索开始位置: /** * Goes
FILE *f = fopen(path, "rb");
在开始从文件复制字节之前,我将使用以下命令搜索开始位置:
/**
* Goes to the given position of the given file.
*
* - Returns 0 on success
* - Returns -1 on EOF
* - Returns -2 if an error occured, see errno for error code
* - Returns -3 if none of the above applies. This should never happen!
*/
static int8_t goto_pos(FILE *f, uint64_t pos)
{
int err = fseek(f, pos, SEEK_SET);
if (err != 0) {
if (feof(f) != 0) return -1;
if (ferror(f) != 0) return -2;
return -3;
}
return 0;
}
问题是,即使我寻求的位置超出了EOF
,该函数也不会返回-1。
根据参考,当遇到EOF
时,feof应返回非零值
为什么会这样?feof
功能是否无效
请注意,我目前正在使用
fgetc
的返回值来检查EOF
查找不会测试文件的结尾
这样做的原因是,您可能希望在需要的地方执行fwrite()
fseek()
调用后无法知道您的计划是为了什么
在文件结尾后面搜索后执行
fread()
,您将得到feof()
返回非零值。feof()
是在尝试读取失败后设置的,因此fgets()
或fread()
before.在某些操作系统上查找文件末尾以外的内容会增加文件的大小。只要有空间使文件变大,它就不会返回错误。在EOF之外搜索将在后续写入后放大文件,因此这是一致的,与其他人所认为的相反。请看这里:
fseek()函数应允许将文件位置指示器设置在文件中现有数据的末尾之外。如果随后在此点写入数据,则间隙中数据的后续读取将返回值为0的字节,直到数据实际写入间隙
这就是为什么fseek不能返回EOF。如果您尝试读取某个位置,而之前未向该位置或后面写入任何内容,则稍后将获得EOF。因此,这都是正确的行为。在fseek的文档中,您在哪里看到它会设置EOF标志?@Mat:OP没有明确说明这一点…(@alk:这是提示OP去检查手册页/POSIX参考/任何适用的)我并不是说这是针对个人的。请原谅有点愤世嫉俗的人试图强迫人们阅读文档。顺便说一句:在一般情况下,最好将随工具提供的文档转换为self,即Linux上开发工具链附带的手册页。如果出现不确定性,建议咨询多个信息源。关于“应该如何”的一个很好的参考是标准:(POSIX),GNU libc中的概述:最后可以从这里的来源阅读手册页:(没有任何令人讨厌的广告!)不仅seeking没有测试eof;它将清除eof标志。感谢您的解释!然后,
feof
对我没有用,因为我正在使用fgetc
并检查EOF
返回值。OP确实在“rb”
模式下打开了流,这种fseek
行为对只读文件没有任何意义。你能提供参考吗?“在某些操作系统上查找文件结尾以外的内容会增加文件的大小。”我怀疑这是否符合C标准。