Objekt in Datei speichern



  • Hallo

    Ich habe einen objektorientierten Terminkalender (Klassen: Termin, Kalender) programmiert. Nun möchte ich die Termine natürlich auch speichern können, dazu müsste ich die Kalenderklasse in eine Datei speichern (diese enthält alle Termine).

    Schreibe ich einfach das Objekt über einen ostream in eine Datei, so stehen da nur vier Bytes drin. So geht es also schon mal nicht...

    Jetzt kann man ja über eine Boost-Bibliothek das Objekt serialisieren, allerdings ist das ein Schulprojekt und ich glaube nicht, dass mein Lehrer Lust hat, sich die Boost-Bibliotheken erst bauen zu müssen.

    Gibt es noch eine andere Möglichkeit, ein Objekt (welches andere Objekte enthält) in eine Datei zu speichern und später wieder auszulesen?

    Gruß,
    Andy


  • Mod

    Du verpasst jedem Membertyp einen operator<<(ostream&, const Membertyp&) der die Daten dieser Klasse sauber ausgibt und einen passenden operator>>(istream&, Membertyp&) um genau diese Daten wieder einlesen zu können. Höhere Klassen bekommen auch solche Operatoren, die dann einfach nur die Operatoren ihrer Member aufrufen. Das machst du bis zur höchsten Instanz und dann hast du, was du möchtest und deine Klassen verhalten sich scûönerweise wie die meisten anderen Datentypen auch, was Ein- und Ausgabe angeht.

    Dies ist im Prinzip der manuelle Weg von dem, was Boost macht. Ich empfehle aber auf jeden Fall menschenlesbare Formate. Aus deinem Beitrag entnehme ich, dass du versucht hast, das Objekt mit write oder ähnlichem zu speichern. Das geht natürlich bei naiver Anwendung schief, weil dein Objekt nicht POD ist. Der einzige größere Vorteil der Technik wäre Speicherbedarf und Geschwindigkeit, aber das sollte beides hier wohl kaum von Bedeutung sein.

    P.S.: Ein paar Startpunkte, falls du nicht weißt, wovon ich rede:
    http://www.c-plusplus.net/forum/232010
    Google: c++ overload stream operator



  • Wow, richtig gute Antwort. Danke, jetzt klappts so wie gewünscht 👍 🙂

    Nochmal zum Mitschreiben:
    Ich habe jetzt die Operatoren "operator>>" und "operator<<" überlagert und mit den jeweiligen Klassen befreundet. Dort lege ich fest, wie die Daten gespeichert werden sollen. Genau nach diesem Schema lese ich sie wieder ein.

    FUNZT!

    Danke nochmal! 👍



  • Ich glaub du meinst Überladen, nicht Überlagert.

    gruß
    syntax



  • SeppJ schrieb:

    Du verpasst jedem Membertyp einen operator<<(ostream&, const Membertyp&) der die Daten dieser Klasse sauber ausgibt und einen passenden operator>>(istream&, Membertyp&) um genau diese Daten wieder einlesen zu können. Höhere Klassen bekommen auch solche Operatoren, die dann einfach nur die Operatoren ihrer Member aufrufen. Das machst du bis zur höchsten Instanz und dann hast du, was du möchtest und deine Klassen verhalten sich scûönerweise wie die meisten anderen Datentypen auch, was Ein- und Ausgabe angeht.

    Hallo,
    Könntest du mir bitte ein kleines beispiel schreiben? Habe viel danach gesucht aber nichts gefunden... 😞
    Vielen dank schonmal 🙂



  • struct Foo
    {
    	int myVal;
    	double myVal2;
    
    	friend std::ostream& operator<<(std::ostream & os, Foo const& f)
    	{
    		os << f.myVal << " " << f.myVal2;
    		return os;
    	}
    
    	friend std::istream& operator>>(std::istream & is, Foo & f)
    	{
    		is >> f.myVal >> f.myVal2;
    
    		return is;
    	}
    };
    


  • Vielen dank, jetzt funktioniert alles 😃


Log in to reply