如何检测boost存档中是否还有任何内容

时间:2010-08-30 08:02:50

标签: c++ serialization 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 个答案:

答案 0 :(得分:2)

当您尝试在文件结束后读取内容时,可以设置

stream.eof(),而不是在您从中读取最后一个字节时。

在流中启用异常并尝试读取直到抛出异常可能有效。

答案 1 :(得分:2)

在尝试某些操作之前,流不能设置任何标志。

您可以使用peek()查看并返回但不删除流中的下一个字符。这足以设置一个标志,所以:if (stream.peek(), !stream.eof()) /* peek was not eof */