boost :: archive :: text_iarchive构造函数异常

时间:2015-02-12 23:45:40

标签: c++ exception serialization boost catch-all

我在64位Windows 7上使用Embarcaderro C ++ Builder XE7(默认情况下提供Boost库)。

我觉得很奇怪,boost :: archive :: text_iarchive的构造函数会引发一些异常,因为似乎没有错位。我在stackoverflow上发现了类似的问题,但问题是,构造函数不在try块中。

我的代码看起来像这样(请注意,这个main()实际上是按下按钮时执行的功能,因为我使用C ++ Builder。粘贴整个代码会让人感到困惑和不必要)。

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
using namespace std;

int main()
{
    int numbers1[10] , numbers2[10];
    for(int i=0; i<10; i++) {numbers1[i] = i;}

    ofstream ofs("D:/Pulpit/file.txt", ios::out | ios::trunc);
    if(!ofs.good()) return 1;
    boost::archive::text_oarchive oar(ofs); //no exception
    oar << numbers1;

    fstream ifs("D:/Pulpit/file.txt", ios::in);
    if(!ifs.good()) return 1;
    boost::archive::text_iarchive iar(ifs); //exception
    iar >> numbers2;
}

正如你所看到的,它只是定义了iarchive,使用了std :: ifstream参数,它被正确打开了(因为if(!ifs.good()))。但是我仍然得到类型boost :: archive :: archive_exception的异常。真奇怪的是,我无法以任何方式处理它。即使是catch(...)也没有捕获它,我的程序终止了。

我确定costructor(或者也许是析构函数?)抛出异常 - 注释掉最后两行后一切正常。

输出类 - oarchive - 不会抛出异常。它似乎将所有内容序列化,但我无法阅读它。如果我尝试使用stringstreams而不是fstreams,从而排除文件失败,同样的事情就会发生。

1 个答案:

答案 0 :(得分:1)

您必须先关闭输出文件/存档,然后再将其作为输入打开。

否则不会刷新完整档案:

<强> Live On Coliru

{
    std::ofstream ofs("file.txt");
    if (!ofs.good())
        return 1;

    boost::archive::text_oarchive oar(ofs); // no exception
    oar << numbers1;
}

{
    std::ifstream ifs("file.txt");
    if (!ifs.good())
        return 1;
    boost::archive::text_iarchive iar(ifs); // no exception!
    iar >> numbers2;
}

字符串流解决方案: Live On Coliru

输出

0 1 2 3 4 5 6 7 8 9