C - 在读取之前查找文件末尾

C - Finding end of file BEFORE reading

提问人:Virus721 提问时间:5/13/2013 更新时间:5/13/2013 访问量:8147

问:

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

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

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

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

感谢您的帮助!:)

C 二元 EOF Fread Feof

评论

0赞 BLUEPIXY 5/13/2013
尝试阅读一个字母和 ungetc。
0赞 Virus721 5/13/2013
感谢大家的帮助,但我只是找到了一种方法(见我的答案)。再次感谢。

答:

6赞 Sergey Kalinichenko 5/13/2013 #1

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

1赞 Amol Patil 5/13/2013 #2

一种方法是

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

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

其他信息 C 中二进制文件和文本文件之间的区别

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

2赞 Some programmer dude 5/13/2013 #3

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

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

1赞 KrisSodroski 5/13/2013 #4

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

将流设置为您正在读取的文件,将偏移量设置为 -1(如果您读取的字符是),然后将 wherehence 设置为 SEEK_CUR。

这将使您看到EOF是否存在,如果EOF不存在,则将照常继续。

2赞 Virus721 5/13/2013 #5

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

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);
}