C - 在阅读之前查找文件结尾

时间:2013-05-13 13:26:22

标签: c binary eof fread feof

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

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

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

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

感谢您的帮助! :)

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

然后,当您需要知道文件中是否还有更多内容时,您可以简单地检查当前文件的位置并将其与最后的文件位置进行比较。

答案 2 :(得分: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);
}

答案 3 :(得分:1)

一种方式是

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

您可以找到所有方式here

其他信息 Difference between Binary and Text file in C

Example

我从互联网上收集的这些方式。你需要在使用前试用它们。

答案 4 :(得分:1)

获得下一个块后,读取一个字符并检查其是否为EOF。如果是,请休息。如果没有,那么fseek返回一个字节,如下所示:http://linux.die.net/man/3/fseek

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

这会让你看到它的EOF,如果没有,那么你将继续正常。