fseek在EOF之外的位置不会触发使用feof的EOF,为什么会这样?

时间:2013-06-23 18:18:19

标签: c linux io eof fseek

我正在将数据从文件读取到以下打开的内存:

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

4 个答案:

答案 0 :(得分:12)

寻求根本不测试文件的结束。

这样做的原因是你可能想要在你想要的地方做fwrite()fseek()在调用之后无法知道你的计划是什么。

在搜索文件结束后执行fread(),您将feof()返回非零值。

答案 1 :(得分:5)

尝试阅读失败后设置

feof(),之前fgets()fread()

答案 2 :(得分:1)

在随后的写操作之后,超出EOF位置进行查找将扩大文件,因此这是一致的,这与其他人的看法相反。看这里: fseek

  

fseek()函数应允许将文件位置指示符设置为超出文件中现有数据的末尾。如果此刻以后再写入数据,则随后在间隙中读取数据将返回值为0的字节,直到将数据实际写入间隙为止。

这就是为什么fseek无法返回EOF的原因。如果您尝试从某个位置读取内容,而之前没有对该位置写入任何内容,则稍后将获得EOF。所以这都是正确的行为。

答案 3 :(得分:0)

在某些操作系统上查找文件末尾会增加文件的大小。只要有足够的空间使文件变大,它就永远不会返回错误。