Pratik Patil
Pratik Patil

Reputation: 101

Reading from boost serialized file throws exception

I am new to c++ coding. I am trying run this code on visual studios to read from boost serialized binary, and when I try to read from it, it throws exception.

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/binary_object.hpp>


using boost::serialization::make_binary_object;

enum class Example : uint32_t {
    A = 1,
    B = 2,
};

int main() {
    int data = 5;

    std::ofstream f("data.dat", std::ios::binary);
    boost::archive::binary_oarchive ar(f);
    ar << make_binary_object(&data, sizeof(data));

    uint32_t restored_info;
    std::ifstream Obj_ifstream("data.dat", std::ios::binary);
    boost::archive::binary_iarchive ip_archive(Obj_ifstream);
    ip_archive >> restored_info;

    std::cout << "Testing " << std::endl;
    system("PAUSE");
}

Exception:

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

Upvotes: 1

Views: 142

Answers (1)

user4290866
user4290866

Reputation:

You open the inputfile stream before the output file stream is closed (you cannot open the file for read and write simultaniously). Make sure to close it first as mentioned by @rafix07 in his comment, or encapuslate the code blocks like so:

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/binary_object.hpp>


using boost::serialization::make_binary_object;

enum class Example : uint32_t {
    A = 1,
    B = 2,
};

int main() {
    int data = 5;

    {
        std::ofstream f("data.dat", std::ios::binary);
        boost::archive::binary_oarchive ar(f);
        ar << make_binary_object(&data, sizeof(data));
    }
    {
        uint32_t restored_info;
        std::ifstream Obj_ifstream("data.dat", std::ios::binary);
        boost::archive::binary_iarchive ip_archive(Obj_ifstream);
        ip_archive >> restored_info;
        std::cout << "restored ino " << restored_info << std::endl;
    }

    std::cout << "Testing " << std::endl;
    system("PAUSE");
}

Upvotes: 2

Related Questions