【问题标题】:C - Finding end of file BEFORE readingC - 在阅读之前找到文件的结尾
【发布时间】:2013-05-13 13:26:22
【问题描述】:

我有一个从二进制文件中读取“块”的类。我是这样用的:

while(log.HasNextBlock()) {
    block = log.GetNextBlock();
}

我的问题是如果我在文件末尾,我需要检查函数 HasNextBlock() 的内部,在这种情况下我会返回 false。我想使用 feof() 来检查,但我读到我必须在调用 feof() 之前执行读取操作,但在我的情况下,读取操作是在 GetNextBlock() 中完成的,即在调用 feof 之后()。

有没有一种方法可以查看我是否在二进制文件的末尾而不执行修改“上下文”的操作(即不更改文件中的当前位置或任何其他变量)?

感谢您的帮助! :)

【问题讨论】:

  • 试着读一个字母然后ungetc。
  • 感谢大家的回答,但我只是找到了一种方法(见我的回答)。再次感谢。

标签: c binary eof fread feof


【解决方案1】:

在开始循环之前,调用fseek 转到文件末尾(即使用SEEK_END),并使用ftell 查找当前位置。这会让您知道EOF 的位置。然后使用fseek 再次使用SEEK_SET 回到文件的开头,并继续循环。当您需要知道您是否在EOF 时,调用ftell 并将位置与您在进入循环之前存储的文件的大小进行比较。

【讨论】:

    【解决方案2】:

    在打开文件时可以寻到文件末尾,获取文件位置,然后再次寻回文件开头。

    然后当您需要知道文件中是否还有更多要读取的内容时,您只需检查当前文件位置并将其与末尾的位置进行比较。

    【讨论】:

      【解决方案3】:

      感谢大家的回答!我刚刚找到了解决方案:

      long lOldPos = ftell(m_pFile); // Saving current position
      fseek(m_pFile, 0, SEEK_END); // Going to end of file
      bool bAtEof = lOldPos == ftell(m_pFile); // If end of file position equals old position, we were at eof.
      if( ! bAtEof) {
          // Position was changed, restoring it.
          fseek(m_pFile, lOldPos, SEEK_SET);
      }
      

      【讨论】:

        【解决方案4】:

        获取下一个块后,读取一个字符并检查其是否为 EOF。如果是,请打破。如果不是,则 fseek 像这样返回一个字节:http://linux.die.net/man/3/fseek

        将您的流设置为您正在阅读的文件,将偏移量设置为 -1(如果您正在读取字符),并将 wherece 设置为 SEEK_CUR。

        这会让您看到 EOF 是否存在,如果不存在,那么您将照常继续。

        【讨论】:

          【解决方案5】:

          一种方法是

          while ((c = getchar()) != EOF)
          

          你可以找到所有方法here

          附加信息 Difference between Binary and Text file in C

          Example

          这些方法是我从网上收集的。您需要在使用前尝试一下。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多