2015-02-21 2 views
1

Мне нужно написать/прочитать файл, содержащий std :: map. Файл должен быть прочитан при запуске программы (если он существует). Им с помощью fstream бустер, но им получить это:C++: используйте Boost Serialization для записи/чтения файлов

"terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): input stream error" 

Ну, я действительно не знаю, что происходит .. это мои строки:

map<int64_t, int64_t> foo; 
filesystem::path myFile = GetWorkingDirectory()/"myfile.dat"; 
[...............] // some code 

filesystem::ifstream ifs(myFile); 
archive::text_archive ta(ifs); 
if (filesystem::exists(myFile) 
{ 
    ta >> foo; // foo is empty until now, it's fed by myFile 
    ifs.close(); 
} 

Что им делать неправильно? Есть идеи? Спасибо.

P.S. Обратите внимание, что некоторые строки после, мне нужно сделать обратное действие: напишите в myfile.dat std :: map foo.

EDIT: все работает, если я использую std :: ifstream, сохраняя файл в том же каталоге, где im запускает приложение. Но, используя импульс и его путь, что-то пошло не так.

+0

Каков ваш фактический ввод? –

+0

Я пробовал без ввода (удаление файла) и с файлом file.dat, который я ранее создал таким же образом с помощью std :: ofstream..и обе дали мне ошибку выше – sciakysystem

+0

, как файл содержал 'std :: map'? – Barracuda

ответ

2

Я немного растерялся. Вы явно используете Boost Serialization (заголовки archive/ являются частью этой библиотеки), но почему-то вы об этом ничего не говорите. Потому что это так легко продемонстрировать:

Live On Coliru

#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/filesystem.hpp> 
#include <boost/filesystem/fstream.hpp> 

using namespace boost; 

int main() { 
    std::map<int64_t, int64_t> foo; 
    filesystem::path myFile = filesystem::current_path()/"myfile.dat"; 

    if (filesystem::exists(myFile)) 
    { 
     filesystem::ifstream ifs(myFile/*.native()*/); 
     archive::text_iarchive ta(ifs); 

     ta >> foo; // foo is empty until now, it's fed by myFile 

     std::cout << "Read " << foo.size() << " entries from " << myFile << "\n"; 
    } else { 
     for (int i=0; i<100; ++i) foo.emplace(rand(), rand()); 
     filesystem::ofstream ofs(myFile/*.native()*/); 
     archive::text_oarchive ta(ofs); 

     ta << foo; // foo is empty until now, it's fed by myFile 
     std::cout << "Wrote " << foo.size() << " random entries to " << myFile << "\n"; 
    } 

} 

Печать

Wrote 100 random entries to "/tmp/myfile.dat" 

А на втором прогоне:

Read 100 entries from "/tmp/myfile.dat" 
+0

Прежде всего, спасибо за ваш быстрый ответ. Ну, извините за мой не-хорошо написанный вопрос, но вы все равно попали в точку. Мой код в точности соответствует вашему примеру .. так почему я получил эту ошибку? im so confused .. – sciakysystem

+0

EDIT: я решил изменить путь. Не уверен, почему, но теперь он работает правильно. Спасибо, однако, – sciakysystem

Смежные вопросы