当前位置: 首页 > 面试题库 >

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

曹景铄
2023-03-14
问题内容

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

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我陷入了这个非常奇怪的问题。在客户端中,我传递的对象是 在服务器中,我正在读取对象 我的问题是为什么我会出现EOF异常。我对对象输入流的理解是,当我调用readObject()时应该阻塞直到获得对象,这样才能知道是否达到了eof?请帮忙! 这就是我创建对象流的方式 另外,在我写完对象并刷新之后,我应该关闭流。我不会关闭它,因为对象是从代码的不同部分开始一个接一个地定期编写的。 问题答案

  • eof

    描述 (Description) 如果FILEHANDLE上的下一次读取将返回文件结尾,或者如果FILEHANDLE未打开,则此函数返回1。 没有参数的eof使用最后读取的文件。 使用带空括号的eof()是非常不同的。 它指的是由命令行中列出的文件形成的伪文件,可通过<>运算符访问。 语法 (Syntax) 以下是此函数的简单语法 - eof FILEHANDLE eof() eof 返回值 (

  • 我正在尝试序列化然后反序列化多个对象。我可以毫无问题地写入文件,但当选择反序列化选项时,我会得到以下堆栈跟踪。以前,我可以成功地序列化和反序列化一个对象。

  • 主要内容:实例,实例PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。 使用概述: 1. 必须后接分号,否则编译通不过。 2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。 3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和

  • 每次我的WebSocket向我的客户机发送消息时,客户机都会为连接调用onClose-function,而不会接收到消息。 错误为1006-Websocket读取EOF 我知道这个答案得到websockets关闭的原因,所以错误是由浏览器本地的,但我使用的是Firefox(最新的)和html和javascript代码没有什么特别的。 直到服务器调用session.getRemote()。SendS

  • 我有一个问题,当我尝试读取任何输入时,我的网络连接会抛出一个EOFException。该代码适用于某些网络调用,但不适用于其他网络调用。如果我尝试从连接中读取任何内容,则会失败并出现上述错误。 例: 以下是每个堆栈的跟踪: getResponse: 缓冲输入流: 感谢您的任何帮助, 瑞克 编辑 我找到了我的答案: 这不是一个有据可查的答案。它出现在一些较新版本的android中,存在一个带有回收u