C ++ ein Objekt in eine Datei schreiben und später einlesen? [Duplikat]

8

Ich habe in den letzten Tagen immer mehr mit C ++ herumgespielt und habe bisher nur ein paar Erfahrungen mit ofstream gemacht. Die meisten dieser Erfahrungen haben eine einfache Dateiausgabe von Variablen gemacht und sie mit ifstream wieder eingelesen. Was ich nicht gemacht habe, ist irgendetwas mit Objekten.

Nehmen wir an, ich habe ein Objekt, zu dem häufig geschrieben wird (sagen wir ein Spiel und das Objekt ist der Charakter) Jedes Mal, wenn der Charakter getroffen wird, wird die HP jedesmal neu geschrieben, wenn sie einen Gegner besiegen Erfahrung sammeln .... meine Grundidee ist es, ein einfaches textbasiertes Dungeon-Crawling-Spiel zu schreiben. Aber wie mache ich eine Art Autosave-Datei? Schreibe ich einfach jedes Attribut meines Objekts einzeln in eine Datei und gehe dann von dort auf größer und besser? Wenn ich es jetzt tun müsste, würde ich es so machen, aber ich kann nicht anders als zu fühlen, dass es einen einfacheren Weg gibt als das ....

Wer möchte mir helfen, den Inhalt eines ganzen Objekts (und seiner jeweiligen Attribute) in einer Datei auszugeben?

    
HunderingThooves 12.10.2011, 15:17
quelle

6 Antworten

6

Sie können das Objekt einfach in eine Datei schreiben, indem Sie dessen Inhalt kopieren.

Aber dann triffst du die heiklen Stellen! Sie können keine Elemente kopieren, die Zeiger auf den Speicher sind, da sie diesen Speicher nicht besitzen, wenn Sie sie wieder laden. Das bedeutet, dass das Kopieren von Dingen wie std :: string, die intern ihre eigene Speicherzuweisung enthalten, ebenfalls knifflig ist.

Dann gibt es auch bei Standardtypen Probleme, wenn Sie planen, sie auf einer anderen Maschine mit einer anderen Anzahl von Bits oder einer anderen Byte-Reihenfolge zu lesen.

Der Prozess heißt Serialisierung - es gibt ein paar Standards Techniken, um es einfacher zu machen.

    
Martin Beckett 12.10.2011, 15:22
quelle
3

Sehen Sie sich diesen Code an:

%Vor%

Dies ist eine einfache Struktur mit überladenen & gt; & gt; und & lt; & lt; Betreiber. Dadurch können Sie in eine Datei wie myOfstreamFile & lt; & lt; obj; Und lesen Sie umgekehrt.

Wenn Sie sagen, dass tausend Objekte in einer Datei gespeichert sind, können Sie sie einfach in einen Container wie folgt einfügen:

%Vor%

Natürlich könnten Sie andere Formen der Eingabe und Ausgabe z.B. Speichern Sie im .xml-Format und analysieren Sie es als Dom-Baum usw. Dies ist nur ein Beispiel.

BEARBEITEN: Dies funktioniert für relativ einfache Objekte. Sehen Sie sich die Serialisierung an, wenn Sie etwas Komplexeres brauchen

    
FailedDev 12.10.2011 15:24
quelle
2

Durchsuchen Sie das Web und SO nach "Serialisierung". Es gibt einige Unebenheiten, auf die man achten sollte: Fließkomma, Endianess und Felder variabler Länge (Strings).

Viel Glück!

    
Thomas Matthews 12.10.2011 15:22
quelle
1

Hinter Ihrer einfachen Frage verbirgt sich ein komplexes Thema. Bitte werfen Sie einen Blick auf boost :: serialization ( hier zum Beispiel) . Jede Zeit, die zum Lernen aufgewendet wird, ist sehr lohnend.

    
CapelliC 12.10.2011 15:36
quelle
1

Boost hat eine nette Bibliothek namens Boost.Serialize . Wenn Sie nach Leistung suchen, ist dies wahrscheinlich nicht die richtige Wahl, aber wenn Sie sich den Quellcode und die Verwendung ansehen, können Sie einige Ideen finden. Serialisierung / Deserialisierung kann schwierig sein, besonders wenn Sie viele verschachtelte Komponenten haben. JSON ist ein sehr schönes Format zum Serialisieren von allgemeinen Objekten.

    
gred 12.10.2011 16:32
quelle
0

Hier ist ein Hacky-Trick, der wahrscheinlich Programmierer dazu bringt, sich die Haare auszureißen und mich anzuschreien (das funktioniert nur für statische Objekte und nicht für solche, die dynamische Speicherzuweisung verwenden):

%Vor%

Was ergibt:

  

Numerik ist: 1000
  Statisches Array ist: Dateneingabe
  300 200 100
  Numerik ist: 1000
  Statisches Array ist: Dateneingabe
  300 200 100

Öffnen der Datei zeigt die geschriebenen Daten:
è Data input w, È d

Der obige Trick ermöglicht eine einfache Umwandlung in ein Byte-basiertes Format. Natürlich ist das Hacky, aber Klassen (oder Objekte) sollten ihren eigenen Objekt-zu-Char Array-Konvertierungsprozess liefern.

    
SSight3 12.10.2011 21:16
quelle

Tags und Links