提问人:Virus721 提问时间:5/13/2013 更新时间:5/13/2013 访问量:8147
C - 在读取之前查找文件末尾
C - Finding end of file BEFORE reading
问:
我有一个从二进制文件中读取“块”的类。我是这样使用它的:
while(log.HasNextBlock()) {
block = log.GetNextBlock();
}
我的问题是,如果我在文件末尾,我需要检查函数 HasNextBlock() 的内部,在这种情况下,我将返回 false。我打算使用 feof() 来检查这一点,但我读到我必须在调用 feof() 之前执行读取操作,但在我的情况下,读取操作是在 GetNextBlock() 中完成的,即在调用 feof() 之后。
有没有办法在不执行修改“上下文”的操作(即不更改文件中的当前位置或任何其他变量)的情况下查看我是否处于二进制文件的末尾?
感谢您的帮助!:)
答:
在开始循环之前,调用 fseek
转到文件末尾(即 with ),并使用 ftell
查找当前位置。这将使您知道将在哪里。然后再次使用 返回文件开头 ,然后继续循环。当您需要知道您是否在 时,调用该位置并将其与您在进入循环之前存储的文件的大小进行比较。SEEK_END
EOF
fseek
SEEK_SET
EOF
ftell
一种方法是
while ((c = getchar()) != EOF)
你可以在这里找到所有的方法
这些方式是我从互联网上收集的。您需要在使用前试用它们。
打开文件时,您可以搜索到文件的末尾,获取文件位置,然后再次查找回文件的开头。
然后,当您需要知道文件中是否有更多要读取的内容时,只需检查当前文件位置并将其与末尾的文件位置进行比较即可。
获取下一个块后,读取一个字符并检查其 EOF。如果是,请中断。如果没有,则像这样返回一个字节:http://linux.die.net/man/3/fseek
将流设置为您正在读取的文件,将偏移量设置为 -1(如果您读取的字符是),然后将 wherehence 设置为 SEEK_CUR。
这将使您看到EOF是否存在,如果EOF不存在,则将照常继续。
谢谢大家的回答!我刚刚找到了解决方案:
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);
}
评论