一尘不染

在超出EOF的位置上fseek不会使用feof触发EOF,为什么?

linux

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

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。

根据参考feofEOF遇到时应返回非零值。

为什么是这样?该feof功能没用吗?


请注意,我目前正在使用的返回值fgetc来检查EOF


阅读 305

收藏
2020-06-07

共1个答案

一尘不染

寻求根本无法测试文件的结尾。

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

fread()在文件末尾进行查找后再执行一次,您将feof()返回非零值。

2020-06-07