исключение boost :: archive :: text_iarchive

Я использую Embarcaderro C ++ Builder XE7 (который по умолчанию предоставляет библиотеку Boost) в 64-битной Windows 7.

Я нахожу странным, что конструктор 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 (…) не ловит его, и моя программа завершается.

Я уверен, что исключение выдается конструктором (или, может быть, деструктором?) — все работает нормально после закомментирования последних двух строк.

Выходной класс — oarchive — не выдает исключений. Кажется, все отлично сериализуется, но я не могу прочитать это тогда. Если я пытаюсь использовать строковые потоки вместо потоковых, исключая, таким образом, сбой файла, происходит то же самое.

1

Решение

Вы должны закрыть выходной файл / архив, прежде чем открывать его как ввод.

В противном случае не полный архив будет сброшен:

Жить на Колиру

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

Строковое решение: Жить на Колиру

Выход

0 1 2 3 4 5 6 7 8 9
1

Другие решения


По вопросам рекламы [email protected]