0

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

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

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

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

谢谢你的帮助 !:)

4

5 回答 5

5

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

于 2013-05-13T13:31:31.420 回答
2

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

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);
}
于 2013-05-13T13:35:39.183 回答
2

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

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

于 2013-05-13T13:31:42.243 回答
1

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

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

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

于 2013-05-13T13:32:54.490 回答
1

一种方法是

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

你可以在这里找到所有方法

C中二进制文件和文本文件之间的附加信息 差异

例子

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

于 2013-05-13T13:31:36.867 回答