代码之家  ›  专栏  ›  技术社区  ›  FireAphis david.pfx

如何检测Boost存档中是否还有任何东西

  •  0
  • FireAphis david.pfx  · 技术社区  · 14 年前

    在我读到Boost档案之后,有没有一种方法可以检测它里面是否还有什么东西?我试过这段代码:

    const string s1("some text");
    std::stringstream stream;
    boost::archive::polymorphic_text_oarchive oAr(stream);
    oAr << s1;
    
    boost::archive::polymorphic_text_iarchive iAr(stream);
    string s2;
    iAr >> s2;
    
    if (!stream.eof())
    {
        // There is still something inside the archive
    }
    

    我期望流对象像直接从中读取一样被更新,但是在上面的代码中 stream.eof() 总是 false 尽管我读了我写的所有东西。将字符串更改为int得到了相同的结果。

    我之所以需要这种能力,是因为我读的不是我写的同一种类型:

    const string s1("some text");
    std::stringstream stream;
    boost::archive::polymorphic_text_oarchive oAr(stream);
    oAr << s1;
    
    boost::archive::polymorphic_text_iarchive iAr(stream);
    int s2;
    iAr >> s2; // string was written but int is read
    

    我知道在这种情况下我做不了什么,但我希望至少检查一下我读了所有的东西,能给我一些指示,看读和写之间是否有不一致之处。有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   blaze    14 年前

    stream.eof()可以在您试图在文件结束后读取某些内容时设置,而不是在您已从中读取最后一个字节时设置。

    在流中启用异常并尝试读取,直到引发异常为止,这可能有效。

        2
  •  2
  •   GManNickG    14 年前

    流在尝试某些操作之前无法设置任何标志。

    你可以使用 peek() 偷看并返回,但不删除流中的下一个字符。这足以设置标志,因此请执行以下操作: if (stream.peek(), !stream.eof()) /* peek was not eof */ .