Daten in binärer Form abspeichern



  • Hi, ich habe ein Problem mit der binären Abspeicherung von Daten:
    Ich habe eine eigene Template-Klasse MyVec zur Speicherung und Handhabung von Vektoren. Für diese möchte ich eine Methode zum binären speichern (oder besser habe ich schon 🙂 ). Zur verdeutlichung des Porblems reicht aber folgende einfache Prozedur:

    void Store(MyVec<double> myvec, ostream& ost) {
    	MyVec<double>::size_type N = (MyVec<double>::size_type)(myvec.Rows());
    	ost.write ((char*)(&N), sizeof (MyVec<double>::size_type)); 
    
    	for (MyVec<double>::size_type i = 0; i < myvec.Rows(); ++i)
    	    {ost.write ((char*)(&(myvec(i))), sizeof (double));}
            }
    

    Also erst wird die Größe des Vektor geschrieben, dann die Daten. Einlesen sieht bei mir dann so aus:

    MyVec<double> Restore(istream& ist) {
    	MyVec<double> ret;
    	MyVec<double>::size_type N; 
            ist.read ((char*)(&N), sizeof (size_type)); 
    	ret=MyVec<double> (N);
    	for (MyVec<double>::size_type i = 0; i < ret.Rows(); ++i)
    	    {ist.read ((char*)(&(ret(i))), sizeof (double));}
    	return ret;
    	}
    

    Das funktiniert leider nicht, weil nach dem einlesen Müll im Vektor steht und nicht die ursprünglichen Daten. Ich nehme fast an, das liegt daran, das Größenangabe und Daten unterschiedliche Datentypen haben. lasse ich die Größenangabe weg und gebe sie beim Einlesen von Hand vor klappt es nähmlich prima. Aber die Größenangabe weglassen geht nicht. Die größenangabe in double umwandeln halte ich ebenfalls für keine gute Idee, denn MyVec ist ja eine Templateklasse. Mitt << als ASCII speichern gibt es schon, bei großen Vektoren bringt die binärspeicherung aber erhebliche Speicherplatz- und Zeitvorteile. Deshalb ist auch dieser Vorschlag nicht umsetzbar. Hat jemand eine einfache Lösung des Problems?

    Vielen Dank



  • Hallo,

    eine Klasse besteht aus mehr als nur ihren Datenelementen. Da waeren z. B. noch
    Zeiger auf Elementfunktionen oder die vtable, wenn du virtuelle Elementfunktionen
    hast. Du kannst eine Klasse nicht einfach in eine Datei schreiben und wieder
    laden. Du musst ihre Elemente einzeln abspeichern.

    mfg
    v R



  • Sorry, ich möchte nicht die ganze Klasse abspeichern, sondern nur den Daten-Inhalt.



  • Was ist denn der Rückgabewert der Methode ret(i)?

    Du mußt eine Referenz auf den Speicherbereich des Elements zurückgeben lassen, um darin Daten zu speichern, ansonsten speicherst du in eine temp. Variable.

    Außerdem: hast du denn den Copy-Operator implementiert, da du mit Restore eine Kopie des Vektors zurückgibst?

    Auch sollte die Store-Methode mit einer Referenz arbeiten, ansonsten hast du auch hier erst eine Kopie des Vektors.



  • D$L schrieb:

    Sorry, ich möchte nicht die ganze Klasse abspeichern, sondern nur den Daten-Inhalt.

    Was liefert dir dein op-()?

    mfg
    v R


Anmelden zum Antworten