代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  1
  • Jeff  · 技术社区  · 17 年前

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

    1 回复  |  直到 17 年前
        1
  •  2
  •   Loki Astari    17 年前

    EOF标志仅在尝试读取超过文件结尾后触发。
    阅读 upto 文件结尾将不会触发它。

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

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

    如果read()的结果到达EOF,则将输入循环。
    如果read()的结果超过了EOF,则循环将不会被重写

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

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

    注:

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