c++ - boost::archive::text_iarchive 构造函数异常

标签 c++ exception serialization boost catch-all

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

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

我的代码看起来像这样(请注意,这个 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(...) 也没有捕捉到它,我的程序终止了。

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

输出类 - oarchive - 不会抛出异常。它似乎可以很好地序列化所有内容,但那时我无法阅读。如果我尝试使用 stringstreams 而不是 fstreams,从而排除文件故障,同样的事情也会发生。

最佳答案

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

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

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 

关于c++ - boost::archive::text_iarchive 构造函数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490060/

相关文章:

Laravel Socialite 无法在实时服务器上运行,只能在本地计算机上运行

c#反序列化对象错误的JSON列表

Ruby 序列化游戏类

c++ - IStream 到 MSXML DOMDocument

c# - 查找 VS 输出窗口中显示的异常源

c++ - 具有某些公共(public)成员的强制转换结构

c# - 如果我在 SqlConnection 的 using 语句中捕获异常,using 是否仍然处理关闭和处理我的连接?

java - 如何使用 jackson 将自定义解串器添加到接口(interface)

c++ - TCP协议(protocol),减少RTT瓶颈

c++ - 将 lambda 传递给函数模板