超过EOF的位置上的fseek不会触发使用feof的EOF,怎么办?

我正在从一个文件中读取数据到打开的内存:

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

寻求只是不测试文件的结束。

原因是你也许可能想在你想要的地方做一个fwrite()fseek()在被调用后不知道你的计划是什么。

在文件结束后寻找一个fread() ,你将会有feof()返回一个非零值。

尝试读取失败后设置feof() ,所以在fgets()fread()之前。

在一些操作系统上寻找超出文件末尾的文件会增加文件的大小。 只要有足够的空间使文件变大,就不会返回错误。