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

时间:2009-07-08 17:55:04

标签: c++ stl ifstream

在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。

1 个答案:

答案 0 :(得分:2)

只有在您尝试读取文件末尾后才会触发EOF标志 读取upto文件末尾不会触发它。

这就是为什么大多数代码都是这样的:

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

如果read()的结果上升到EOF,则输入循环 如果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
}