Frage zu boost-Bibliothek (Speichern und Laden von Objekten)



  • Ich würde gerne ein Objekt in eine Datei speichern. Habe mir dazu dieses Tutorial angeschaut.

    Soweit ich es ausprobiert habe, funktioniert das Speichern, aber das Laden nicht so richtig, denn es kommt der Fehler:

    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::archive::archive_exception> >'
      what():  stream error
    Aborted
    

    Ich möchte gerne Objekte meiner Klasser "Uhrzeit" speichern.
    Dazu habe ich die Klasse Uhrzeit folgend implementiert:

    #ifndef UHRZEIT_H_
    #define UHRZEIT_H_
    
    #include <iostream>
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <cstdlib>
    
    class Uhrzeit {
    public:
    	Uhrzeit(int& std_, int& min_) : std(std_), min(min_) {}
    	Uhrzeit(const Uhrzeit& rhs) {
    		std=rhs.std;
    		min=rhs.min;
    
    	}
    	Uhrzeit() : std(-1), min(-1) {}
    
    	void set(const int& s, const int& m) {std=s; min=m; }
    	void set(const Uhrzeit& u) { std=u.getStd(); min=u.getMin(); }
    
    	int getStd() const { return abs(std); }
    	int getMin() const { return abs(min); }
    
    	void clear() { std=-1; min=-1;}
    	virtual ~Uhrzeit() { }
    
    private:
    	friend class boost::serialization::access;
    
    	template <typename Archive>
    	void serialize(Archive &ar, const unsigned int version)
    	{
    		ar & std;
    		ar & min;
    	}
    
    	int std;
    	int min;
    
    };
    
    inline std::ostream& operator<<(std::ostream& ostr, Uhrzeit& rhs) {
    
    	if(rhs.getStd()<10) {
    		ostr << "0";
    	}
    	ostr << rhs.getStd() << ":" ;
    	if(rhs.getMin()<10) {
    		ostr << "0";
    	}
    	ostr << rhs.getMin();
    	return ostr;
    }
    
    inline std::ostream& operator<<(std::ostream& ostr, const Uhrzeit& rhs) {
    	if(rhs.getStd()<10) {
    		ostr << "0";
    	}
    	ostr << rhs.getStd() << ":" ;
    	if(rhs.getMin()<10) {
    		ostr << "0";
    	}
    	ostr << rhs.getMin();
    	return ostr;
    }
    
    #endif /* UHRZEIT_H_ */
    

    Ich hoffe, das ist wenigstens richtig serialisiert.

    Jetzt speichere ich in einer anderen Klasse ein Objekt der Klasse Uhrzeit in eine Datei.
    Das mache ich folgendermaßen:

    /* Erstelle Objekt Uhrzeit, welches in die Datei gespeichert wird */
    	int h=14;
    	int m=24;
    
    	Uhrzeit u(h, m);
            /* filename ist ein String, der den Pfad zur Datei angibt. */
    	fstream f(filename.c_str(), ios::out|ios::binary|ios::trunc);
    	boost::archive::text_oarchive oa(f);
    
    	oa << u;
    

    Hier kommt keine Fehlermeldung und in der Datei steht folgendes (wenn ich diese im Editor oeffne)

    22 serialization::archive 5 0 0 14 24
    

    Beim Laden ist aber das Problem.

    Mein Ladevorgang sieht so aus:

    ifstream f(filename.c_str());
    
    	boost::archive::text_iarchive ia(f);
    
    	Uhrzeit u;
    
    	ia >> u;
    

    Aber wie gesagt, obiger Fehler erscheint dann.

    Kann mir jemand helfen?
    In beiden Dateien ist

    <boost/archive/text_oarchive.hpp>
    

    und

    <boost/archive/text_iarchive.hpp>
    

    inkludiert.


Anmelden zum Antworten