gpt4 book ai didi

c++ - ifstream seekg beyond end 不在 VS 2008 Express 中返回 eof?

转载 作者:行者123 更新时间:2023-11-30 04:40:35 27 4
gpt4 key购买 nike

在 VS 2005 中,我有一些代码如下所示:

ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
loc = ifs.tellg();
loc += bar.dwHeaderSize;
// four byte boundary padding
if ((loc % 4) != 0)
loc += 4 - (loc % 4);
ifs.seekg(loc,ios::beg);
}
ifs.close();

该代码在 VS 2005 中运行良好,但在 VS 2008 Express 中运行失败。据我所知,VS 2008 在代码查找到文件末尾后没有返回 eof() 。我错过了什么吗?我通过添加一个显式检查以查看查找位置是否超过文件大小来修复它,但我想确保我正确理解 ifstream。

最佳答案

EOF 标志仅在您尝试读取超过文件末尾时触发。
读取 upto 文件末尾不会触发它。

这就是为什么大多数代码看起来像这样:

while(ifs.read(&bar,sizeof(bar)))
{
// Do Stuff
}

如果 read() 的结果上升到 EOF,将进入循环。
如果 read() 的结果超过 EOF,则不会进入循环

  • 注意:如果文件中剩余零字节,则 read() 只会越过 EOF。否则它将读取到文件末尾。因此,如果文件中有剩余内容,则始终会进入循环。

原因是读取的结果(返回值)是对流的引用。如果流在 bool 上下文中使用(例如 if 测试表达式),它将转换为可在此类上下文中使用的类型。此转换的结果测试 EOF 标志(以及其他几个标志),如果 EOF 为真,则返回 false 的等价物。

注意:
如果您为您的 Bar 类重载运算符 <<,则此技术会更好地工作,因为它应该准确读取对象所需的内容,而不会超过 EOF。这样就可以更轻松地让您的对象准确读取到文件末尾而无需遍历。我担心 read 的事情是,如果 read() 需要 10 个字节,而文件中只有 5 个字节,那么对于部分填充的对象会发生什么?

如果您想继续使用您的样式,代码应该如下所示:

ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
if (ifs.eof())
{ break;
}
// Do Stuff
}

关于c++ - ifstream seekg beyond end 不在 VS 2008 Express 中返回 eof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099601/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com