Я использую Embarcaderro C++ Builder XE7 (который обеспечивает библиотеку Boost, по умолчанию) на 64-разрядной ОС Windows 7.подталкивания :: архив :: text_iarchive исключение конструктора
Я нахожу странным, что конструктор повышения :: 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 с параметром станд :: ifstream, который должным образом открыт (если из-за (! Ifs.good())). Однако я все еще получаю исключение типа boost :: archive :: archive_exception. Что действительно странно, так это то, что я никак не могу справиться с этим. Даже catch (...) не поймает его, и моя программа завершается.
Я уверен, что исключение выбрано из-за costructor (или, может быть, деструктора?) - все отлично работает после комментирования последних двух строк.
Класс выхода - oarchive - не генерирует исключений. Кажется, все сериализует все, но я не могу его прочитать. Если я попытаюсь использовать строковые потоки вместо fstream, то, исключая отказ файла, происходят одни и те же вещи.
Можете ли вы на самом деле прочитать файл? И проверьте содержимое без использования файла (например, напишите в std :: stringstream и прочитайте его?). Другими словами, можете ли вы уменьшить и устранить? – sehe
@sehe Да, используя ostringstream и istringstream, дали одинаковые результаты (результат, похоже, работает, сбои ввода), за исключением того, что даже обрезающий входной поток не предотвращает исключение в конструкторе (также несовместимо). –
в этом случае, разместите самодостаточный пример, чтобы мы могли исправить вещи :) – sehe