繁体   English   中英

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

[英]fseek on a position beyond EOF does not trigger EOF using feof, how come?

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

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()之前。

在EOF之后寻求将在后续写入之后放大文件,因此这符合其他人的信念。 见这里: fseek

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM