2015-02-12 41 views
1

Я использую 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, то, исключая отказ файла, происходят одни и те же вещи.

+0

Можете ли вы на самом деле прочитать файл? И проверьте содержимое без использования файла (например, напишите в std :: stringstream и прочитайте его?). Другими словами, можете ли вы уменьшить и устранить? – sehe

+0

@sehe Да, используя ostringstream и istringstream, дали одинаковые результаты (результат, похоже, работает, сбои ввода), за исключением того, что даже обрезающий входной поток не предотвращает исключение в конструкторе (также несовместимо). –

+0

в этом случае, разместите самодостаточный пример, чтобы мы могли исправить вещи :) – sehe

ответ

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

stringstream решение: Live On Coliru

Выход

0 1 2 3 4 5 6 7 8 9 
+0

Большое спасибо, сэр, это была именно проблема! –