13

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

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

4 回答 4

16

搜索根本不会测试文件的结尾。

这样做的原因是您可能想要做一个fwrite()您想要做的事情。fseek()打电话后不知道你的计划是什么。

在文件末尾进行搜索后,您fread()feof()返回一个非零值。

于 2013-06-23T18:21:30.440 回答
5

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

于 2013-06-23T18:23:54.063 回答
5

超出 EOF 会在后续写入后扩大文件,因此这是符合要求的,与其他人认为的相反。见这里: fseek

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

这就是 fseek 不能返回 EOF 的原因。如果您尝试从以前没有任何内容写入该位置或后面的位置读取,您稍后将获得 EOF。所以这都是正确的行为。

于 2018-10-23T12:52:26.293 回答
2

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

于 2013-06-23T20:04:43.480 回答