在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。
答案 0 :(得分:2)
只有在您尝试读取文件末尾后才会触发EOF标志
读取upto
文件末尾不会触发它。
这就是为什么大多数代码都是这样的:
while(ifs.read(&bar,sizeof(bar)))
{
// Do Stuff
}
如果read()的结果上升到EOF,则输入循环 如果read()的结果超过EOF,则循环将不会被激活
原因是read(返回值)的结果是对流的引用。如果流在布尔上下文中使用(例如if测试表达式),则将其转换为可在此类上下文中使用的类型。此转换的结果测试EOF标志(除了其他几个)并且如果EOF为真,则返回等效的假。
注意:
如果重载运算符<<<<对于你的Bar类,因为它应该准确读取对象所需的内容,而不必经过EOF。这样就可以更容易地将对象精确地读取到文件的末尾而不必经过。我担心读取的事情是,如果read()想要10个字节并且文件中只有5个字节会发生什么,部分填充的对象会发生什么?
如果您想继续使用您的样式,代码应如下所示:
ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
if (ifs.eof())
{ break;
}
// Do Stuff
}