2012-03-04 3 views
2

У меня проблема с использованием boost::archive::binary_oarchive. При выполнении программы я получаю сбой программы при создании экземпляра ia >> boost::serialization::make_binary_object(buffer, size). С boost::archive::text_oarchive он работает ...boost :: archive :: binary_oarchive = сбой программы?

#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/binary_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/binary_object.hpp> 
#include <iostream> 
#include <fstream> 
using namespace std; 
void save() 
{ 
    size_t size = 0;  
    std::ifstream infile("any_file.png", std::ios::in | std::ios::binary | std::ios::ate); 
    if (infile.is_open()) 
    { 
     size = infile.tellg(); 
     char *buffer = new char[size]; 
     infile.seekg(0, ios::beg); 
     infile.read(buffer, size); 
     infile.close(); 

     std::ofstream file("archiv.bin"); 
     boost::archive::binary_oarchive oa(file); 
     oa << size; 
     oa << boost::serialization::make_binary_object(buffer, size); 
     file.close(); 

     delete [] buffer; 
    } 
} 

void load() 
{ 
    size_t size = 0; 
    std::ifstream file("archiv.bin"); 
    boost::archive::binary_iarchive ia(file); 

    ia >> size; 
    char *buffer = new char[size]; 
    ia >> boost::serialization::make_binary_object(buffer, size); //program crash 
    file.close(); 

    ofstream outfile("any_file_out.png", ios::out | ios::binary); 
    for(size_t i = 0; i < size; i++) 
    { 
     outfile << buffer[i]; 
    } 
    outfile.close(); 
    delete [] buffer; 
} 

int main() 
{ 
    save(); 
    load(); 
    return 0; 
} 

Спасибо заранее!

Редактировать: Так оно и работает.

... 
std::ofstream file("archiv.bin", ios_base::binary); 
... 
std::ifstream file("archiv.bin", ios_base::binary); 
... 
+0

WorksForMe ™, проверил md5sums 'any_file.png' и' any_file_out.png'. Я уверен, что это конфликт версий между файлами libs/headers, которые вы компилируете/связываете, и версией, загруженной во время выполнения. – sehe

ответ

1

Решение представляет собой :)

... 
std::ofstream file("archiv.bin", ios_base::binary); 
... 
std::ifstream file("archiv.bin", ios_base::binary); 
... 

теперь работает отлично!

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