[英]fseek on a position beyond EOF does not trigger EOF using feof, how come?
我正在从一个文件读取数据到打开的内存:
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()
之前。
在EOF之后寻求将在后续写入之后放大文件,因此这符合其他人的信念。 见这里: fseek
fseek()函数应允许将文件位置指示符设置为超出文件中现有数据的末尾。 如果此时稍后写入数据,则后续读取间隙中的数据将返回值为0的字节,直到数据实际写入间隙。
这就是fseek无法返回EOF的原因。 如果您尝试从以前没有任何内容写入该位置或后面的位置读取,您将稍后获得EOF。 所以这是正确的行为。
在某些操作系统上查找超出文件末尾会增加文件的大小。 只要有足够的空间使文件变大,它就永远不会返回错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.