boost::archive::text_iarchive构造函数异常
boost::archive::text_iarchive constructor exception
我在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
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- 智能指针和构造函数异常
- 构造函数C++异常说明符
- boost::archive::text_iarchive构造函数异常
- C++堆栈对象的构造函数异常处理
- 默认构造函数C++异常不会引发吗?
- 当函数中静态变量的构造函数异常终止时会发生什么
- 在c++中,如果基类构造函数异常,则构造函数和析构函数的顺序可以是这样
- 如何捕获构造函数异常
- C++构造函数异常处理
- 捕获构造函数异常的RAII方法
- Std::unique_ptr::reset和构造函数异常