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标准。