einfaches Serialisieren: Probleme beim Einlesen



  • Ich versuch mich grad dran ein einfaches Struct mit einem ofstream auszugeben und durch einen ifstream wieder einzulesen.

    Das Rausschreiben (mit ios::binary) geht natürlich auch ohne Probleme aber beim Einlesen hapert es dann.
    Anstatt, dass "in >> version" 1 ergibt, wird die gesamte Zeile (bis zum ersten String) eingelesen.

    Muss ich mich selbst drum kümmern, dass alles echt byteweise abgespeichert wird?
    Wenn ja - wie??

    #include <string>
    #include <fstream>
    
    using namespace std;
    
    struct T {
    	static const short VERSION;
    
    	T() : Wert1(0), Wert2(0), Text("0") {}
    
    	long Wert1;
    	long Wert2;
    	string Text;
    
    	friend ostream& operator <<(ostream& out, const T& obj);
    	friend istream& operator >>(istream& in, T& obj);
    };
    
    short const T::VERSION(1);
    
    ofstream& operator<<(ofstream& out, const T& obj) {
    	out << obj.VERSION;
    	out << obj.Wert1;
    	out << obj.Wert2;
    	out << obj.Text;
    
    	return out;
    }
    
    ifstream& operator>>(ifstream& in, T& obj) {
    	short version = 0;
    	in >> version;
    	if(version != T::VERSION) 
    		return in;
    
    	in >> obj.Wert1;
    	in >> obj.Wert2;
            in >> obj.Text;
    
    	return in;
    }
    
    int main() {
    
    	T zz;
    	zz.Wert1 = 234;
    	zz.Wert2 = 1;
    	zz.Text = "Ru";
    
    	ofstream out("C:\\temp\\TEST.txt", ios::binary);
    	if(out.is_open()) {
    		out << zz;
    		out.close();
    	}
    
    	T BB;
    	ifstream in("C:\\temp\\TEST.txt", ios::binary);
    	if(in.is_open()){
    		in >> BB;
    		in.close();
    	}
    
    	int i = 0;		
    	return 0;
    }
    


  • wenn du binary speicherst bzw. ausliest,
    solltest du das besser mit write und read machen,
    der op>> << der iostreams ist da leider unzuverlässig.
    Ansonsten musst du beim speichern einfach zwischen
    die zahlen ein ' ' packen, dann gehts auch.



  • Danke, in meinem Hirn hat's grad zweimal *Ahhh* gemacht!

    //EDIT
    Ist aber schon etwas "schade", dass ich dann alles in einen char* casten muss. *baa*


Anmelden zum Antworten