Forum: PC-Programmierung Objekte aus Liste in Datei speichern


von helpme91 (Gast)


Lesenswert?

Hallo zusammen,

ich bin am verzweifeln, ich soll Objekte aus einer abgeleiteten Klasse 
die sich in einer STL liste befinden, in eine binär Datei speichern.
Problem dabei, die Objekte haben unterschiedliche Datentypen, wie: int, 
float, bool.

Nun muss ich diese Objektdaten in eine binärdatei speichern und 
anschließend wieder laden und gleichzeitig wieder in eine Liste 
speichern.

Mein Problem ist das speichern der Daten.
Wie kann ich die Daten aus dem Objekt in eine binäre Datei speichern und 
dann wieder laden? Ich habe ja mehrere unterschiedliche Variablentypen.

PS: Ich poste hier nur code stücke.

Ich habe folgendes versucht:

Das ist die Liste mit Iterator:
1
    list<DATA*> value;
2
    list<DATA*>::iterator ptr;
DATA ist die Basisklasse.

Hier versuche ich die Objekte aus der Liste "value" in die Datei zu 
speichern.
1
    ofstream outputstream("test.dat", ios::binary);
2
    outputstream.write((char*)&value, sizeof(value));
3
    outputstream.close();
4
5
Hier wieder zu lesen:
6
7
    ifstream inputstream("test.dat", ios::binary);
8
    inputstream.read((char*)&value, sizeof(value));
9
    inputstream.close();

Funktioniert nicht.

Wie kann man sowas machen?

: Verschoben durch Moderator
von Milo (Gast)


Lesenswert?

Was Du da tun möchtest, nennt sich 'Serialisierung' oder 
'serialization'.

Unter dem Stichwort dürftest Du einiges zu dem Thema finden.

In der boost-Library gibt es dazu auch ein paar Helferlein:
https://www.boost.org/doc/libs/1_76_0/libs/serialization/doc/index.html

von helpme91 (Gast)


Lesenswert?

ohne geht da nichts?

Weil wir haben das Thema noch nie angesprochen und behandelt.

von Rolf M. (rmagnus)


Lesenswert?

helpme91 schrieb:
> ohne geht da nichts?

Naja, entweder machst du deine Serialisierung selbst, oder du nutzt ein 
bestehendes Framework.
Das Problem hast du ja schon erkannt: Die Datentypen sind 
unterschiedlich, also musst du die Daten so rausschreiben, dass du 
nachher beim lesen wieder eindeutig erkennen kannst, von welchem 
Datentyp jedes gelesene Element ist, so dass du für jedes davon die 
passende abgeleitete Klasse instanziieren kannst. Eine einfache 
Möglichkeit wäre vor dem eigentlichen Wert immer eine Art Kennung in die 
Datei zu schreiben, die die Information enthält, von welchem Datentyp 
das folgende Datum ist.

von helpme91 (Gast)


Lesenswert?

O.k, danke.

Eine Frage noch, wie kann ich beim ifstream in C++ einzelne Zahlen aus 
der Datei einlesen und in eine Variable schreiben?

Beispiel:

In der txt Datei steht in jeder Zeile eine eigene Zahl:

3
11
6

Nun möchte ich diese drei Werte aus der Datei auslesen und jeweils in 
eine Variable schreiben:

int a = 3;
int b = 11;
int c = 6;

Das speichern in eine txt hat schon funktioniert, nur ich schaffe es 
nicht die Zahlen Zeile für Zeile in eine Variable zu schreiben.

SG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.