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

boost::archive::text_iarchive constructor exception

本文关键字:构造函数 异常 iarchive text archive boost      更新时间:2023-10-16

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

我觉得奇怪的是,boost::archive::text_iarchive的构造函数抛出了一些异常,因为似乎没有放错地方。我在stackoverflow上发现了类似的问题,但问题是,构造函数并没有放在try块中。

我的代码看起来是这样的(注意,this 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不会抛出异常。它似乎把所有东西都连载得很好,但那时我读不懂。如果我尝试使用字符串流而不是fstream,从而排除文件故障,同样的情况也会发生。

必须先关闭输出文件/归档文件,然后才能将其作为输入打开。

否则,将不会刷新完整的存档:

在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;
}

字符串流解决方案:LiveOnColiru

输出

0 1 2 3 4 5 6 7 8 9