boost::archive::text_iarchive 构造函数异常
boost::archive::text_iarchive constructor exception
我在 64 位 Windows 7.
上使用 Embarcaderro C++ Builder XE7(默认提供 Boost 库)
我觉得很奇怪,boost::archive::text_iarchive 的构造函数抛出了一些异常,因为似乎没有放错地方。我在 Whosebug 上发现了类似的问题,但问题是,构造函数没有放在 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(...) 也没有捕捉到它,我的程序终止了。
我确信构造函数(或者可能是析构函数?)抛出了异常 - 注释掉最后两行后一切正常。
输出 class - oarchive - 不抛出异常。它似乎可以很好地序列化所有内容,但那时我无法阅读。如果我尝试使用 stringstreams 而不是 fstreams,从而排除文件故障,同样的事情也会发生。
您必须先关闭输出 file/archive,然后才能将其作为输入打开。
否则不会刷新完整的存档:
{
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;
}
stringstream解决方案:Live On Coliru
输出
0 1 2 3 4 5 6 7 8 9
我在 64 位 Windows 7.
上使用 Embarcaderro C++ Builder XE7(默认提供 Boost 库)我觉得很奇怪,boost::archive::text_iarchive 的构造函数抛出了一些异常,因为似乎没有放错地方。我在 Whosebug 上发现了类似的问题,但问题是,构造函数没有放在 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(...) 也没有捕捉到它,我的程序终止了。
我确信构造函数(或者可能是析构函数?)抛出了异常 - 注释掉最后两行后一切正常。
输出 class - oarchive - 不抛出异常。它似乎可以很好地序列化所有内容,但那时我无法阅读。如果我尝试使用 stringstreams 而不是 fstreams,从而排除文件故障,同样的事情也会发生。
您必须先关闭输出 file/archive,然后才能将其作为输入打开。
否则不会刷新完整的存档:
{
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;
}
stringstream解决方案:Live On Coliru
输出
0 1 2 3 4 5 6 7 8 9