我在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,从而排除文件失败,同样的事情就会发生。
答案 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