Frage zu binärem File Handling
-
Hallo!
Ich habe eibne Frage:
Wenn ich z.B. Folgendes habe:struct A { int i; float f; string s; } class B { public: A my_attributes; void display_my_attributes(); }Wenn ich jetzt die Informationen aus einer bestimmten Instanz der Klasse B in einem binären File speichern will (es interessieren ja nur die Informationen aus dem eingebetteten struct), welche der beiden Varianten sollte ich dann wählen:
B inst;
1. file.write((char*)&inst, sizeof(inst));
oder
2. file.write(char*)&inst.my_attributes, iszeof(inst.my_attributes));
Ich weiß jetzt nicht ob der Compiler so schlau ist bei 1. auch nur die Informationen (sprich Variablen) zu speichern, oder ob er jetzt noch irgendwelche Informationen über die Funktionen oder so speichert. Wenn er schlau wäre, bräuchte ich nämlich gar kein eingebettetes struct sondern könnte die Instanz direkt speichern.Ich hab auch schon einen Test gemacht:
Erst die ganze Klasseninstanz gespeichert, die Datei geöffnet, und dann nur in das struct einer anderen Instanz ausgelesen. Die Werte haben alle gestimmt.
Folglich könnten also 1. und 2. gleichwertig sein. Der Binärcode in der Outputdatei, den 1. und 2. produzieren, ist aber unterschiedlich.
Also könnte mein Test theoretisch ein Zufall sein, d.h. das struct stand zufällig ganz am Anfang oder so...Was mein ihr dazu?
-
Was'n los?

Den anderen antwortet ihr fleißig, nur mir nicht. War ich irgendwie unfreundlich? Sorry!
-
Du kannst einen string nicht so in eine Datei schreiben. Der Rest (also ints und floats) würde schon gehen.
-
So einfach geht das nicht, du mußt schon einen Mechanismus entwickeln um deine Daten zu serialisieren und deserialisieren. Java und .Net machen das autom. da sie viel mehr Informationen zur Laufzeit "rumschleppen". C++ ist aber eine Compiler-Sprache, d.h. das meiste ist nur zur Compile-Zeit bekannt und zur Laufzeit gibts kaum Informationen. Deine Methode reicht wirklich nur für einfache Datentypen.
Du kannst dir ein eigenes Konzept überlegen oder was fertiges benutzen. Java z.B. serialisiert seine Objekte mittlerweile "nur" noch in XML. Was garnicht so dumm ist. In C++ wirst du dir aber eine XML-Library (z.B. TinyXML) schnappen müssen und dann selbst basteln.
Oder du schaust mal bei Boost vorbei, die haben was fertig entwickelt, das du benutzen kannst: