我正在将数据从文件读取到以下打开的内存:
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。
根据引用feof
,遇到EOF
时应返回非零值。
这是为什么? feof
函数无效吗?
请注意,我目前正在使用fgetc
的返回值来检查EOF
。
答案 0 :(得分:12)
寻求根本不测试文件的结束。
这样做的原因是你可能想要在你想要的地方做fwrite()
。 fseek()
在调用之后无法知道你的计划是什么。
在搜索文件结束后执行fread()
,您将feof()
返回非零值。
答案 1 :(得分:5)
feof()
,之前fgets()
或fread()
。
答案 2 :(得分:1)
在随后的写操作之后,超出EOF位置进行查找将扩大文件,因此这是一致的,这与其他人的看法相反。看这里: fseek
fseek()函数应允许将文件位置指示符设置为超出文件中现有数据的末尾。如果此刻以后再写入数据,则随后在间隙中读取数据将返回值为0的字节,直到将数据实际写入间隙为止。
这就是为什么fseek无法返回EOF的原因。如果您尝试从某个位置读取内容,而之前没有对该位置写入任何内容,则稍后将获得EOF。所以这都是正确的行为。
答案 3 :(得分:0)
在某些操作系统上查找文件末尾会增加文件的大小。只要有足够的空间使文件变大,它就永远不会返回错误。