在VS2005年,我有一些代码,是这样的:

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

代码的工作现在VS2005年,但它未能在VS2008表达。从什么我可以告诉,与2008年没有返回eof()代码后寻求结束的文件。我失去了一些东西?我固定的通过添加明确的检查,看如果所寻求的位置超过了文件的大小,但是我要确保我的理解ifstream正确。

有帮助吗?

解决方案

EOF标志仅仅是触发的后你试图阅读过的文件。
阅读 upto 结束的文件不会触发它。

这就是为什么多数码看起来是这样的:

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

如果结果的read()转达的EOF循环将进入。
如果结果的read()过去EOF的循环将不可enetered

  • 注:read()将只能走过去的EOF如果有零字左边的文件。否则它会读取高达结束的文件。所以循环总是进入的,如果有财产以后留在该文件。

其原因是结果的读(返回值)是一个参考流。如果流用于在布尔环境(例如,如果测试表达)它转变成一种类型,可用于这样一个背景。结果这种转换的测试EOF标志(外一对夫妇的其他人)和返回quivalent假,如果EOF是真实的。

注:
这个技术工作得更好,如果你过多的操作者 << 你的酒吧类,因为这应该读什么需要的对象,而不会过去的EOF.它是那么容易让你的对象读正是最终的文件没有去过。我担心读取是什么应该发生,如果read()希望10bytesand只有5个字节的文件,会发生什么情况的部分填充的对象?

如果你想继续使用你的风格,该代码应该是这样的:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top