Kette von Instanzen in/aus Datei speichern/laden



  • Hallo Freunde.

    Ich möchte eine Kette von Instanzen, die aus einer Struktur besteht

    struct Inhalt{
    	string Link;
    	string Name;
    	struct Inhalt *pnext;
    };
    

    nach Abschluss der Bearbeitung/Erstellung in eine Datei ablegen. Später, möchte ich jedoch diese Datei wieder öffnen können und die Instanzen genau wie abgespeichert, auch wieder laden können. Ich habe schon versucht mit

    ofstream out("test", ios::out | ios::binary); 
    
      out.write((char *) StartZeiger, sizeof(struct Inhalt)); 
      // ... usw., bis Ende der Kette erreicht wird
    
      out.close();
    

    und dann wieder zu laden mit

    ifstream in("test", ios::in | ios::binary);
    
      in.read((char *) StartZeiger, sizeof(struct Inhalt)) 
      // ... usw., bis Ende der Kette erreicht wird
    
      in.close();
    

    Es wird Inhalt in die Datei geschrieben, doch wenn ich die Datei beim nächsten Programmstart wieder öffne, so ist der Inhalt der beiden Dateien (String) nicht mehr vorhanden bzw. verfälscht. Ich betrachte jetzt nicht die Zeiger um die Kette aufrecht zu erhalten, diese würde ich dann nach dem Import wieder neu anlegen, doch der Inhalt der Strings ist mir im Moment wichtig. Was mache ich falsch?

    Danke Euch.



  • Du schreibst ja auch nur einige Hilfszeiger deiner Datenstruktur in die Datei, da ist es kein Wunder daß es nicht funktioniert. Um alles zu speichern, mußt du dich schon durch die komplette Liste durchhangeln und die beiden Werte per Ausgabe-Operator schreiben (jeweils mit Trennzeichen, damit du sie später wieder auseinandernehmen kannst).

    PS: Übrigens passt die Frage wenig ins MFC-Board.



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo CStoll,

    eigentlich wollte ich Inhalt der Struktur noch weiter ausbauen, so dass dort noch int und double Variablen integriert werden, was aber keine Probleme darstellen wird. Ich habe schon gelesen, dass es nicht einfach sein wird die Instanzen in C++ zu serialisieren, wenn man z.B. in der Instanz eher Zeiger auf die CharArrays verwendet (Verwendung der dyn. Speicherverwaltung), und daher habe ich mit strings versucht. Was meint Ihr, wird das gehen, und wenn ja, dann wie? Oder ist das nur mit fest definierten Chararrays möglich?

    Viele Grüße


  • Mod

    Was heißt hier Serialisieren sei schwierig? Mach es eben einfach richtig! Dein bisheriger Ansatz ist einfach Murks. Das hat mit char[] vs String rein gar nichts zu tun, außer dass du es dir mit char-Arrays selber unnötig schwer machst.

    Definier für deine Klassen einen vernünftigen Ein- und Ausgabeoperator und dann ist es ganz leicht, für andere Klassen die aus diesen Klassen zusammengesetzt sind, wieder neue Operatoren zu schreiben. Da du hier nur eine Klasse hast, die aus ein paar std::strings besteht, bist du schon fast am Ziel, da diese schon allerlei Ein- und Ausleseaktionen können. Dür die ints und doubles, die du noch hinzufügen möchtest, gilt das gleiche.

    Falls du es etwas systematischer haben möchtest, kannst du dir auch mal eine Serialisierungsbibliothek (z.B. boost Serialization) angucken.



  • SeppJ schrieb:

    Was heißt hier Serialisieren sei schwierig? Mach es eben einfach richtig! Dein bisheriger Ansatz ist einfach Murks. Das hat mit char[] vs String rein gar nichts zu tun, außer dass du es dir mit char-Arrays selber unnötig schwer machst.

    Definier für deine Klassen einen vernünftigen Ein- und Ausgabeoperator und dann ist es ganz leicht, für andere Klassen die aus diesen Klassen zusammengesetzt sind, wieder neue Operatoren zu schreiben. Da du hier nur eine Klasse hast, die aus ein paar std::strings besteht, bist du schon fast am Ziel, da diese schon allerlei Ein- und Ausleseaktionen können. Dür die ints und doubles, die du noch hinzufügen möchtest, gilt das gleiche.

    🙄



  • Hallo SeppJ,

    danke für die Antwort. Ich komme leider bei der Hilfestellung (Operator) nicht gleich zurecht. Wenn Du damit die Setter/Getter Methoden meinst, ist das einfach gemacht, hast Du ja recht. Oder meinst Du damit die Konstruktoren/Destruktoren, was eigentlich auch einfach zu machen ist. Ich würde Dir für ein kleines Beispiel eventuell sogar mit nur einer String-Variable danken, weil von dieser kann ich dann auch alles andere ableiten. Ich habe leider für diese Aufgabe nur Beispiele für Java, doch Java benutze ich schon seit längerem nicht mehr, arbeite eher mit C++ zur Zeit.

    Vielen Dank.



  • parabolis schrieb:

    Hallo SeppJ,

    danke für die Antwort. Ich komme leider bei der Hilfestellung (Operator) nicht gleich zurecht. Wenn Du damit die Setter/Getter Methoden meinst, ist das einfach gemacht, hast Du ja recht. Oder meinst Du damit die Konstruktoren/Destruktoren, was eigentlich auch einfach zu machen ist. Ich würde Dir für ein kleines Beispiel eventuell sogar mit nur einer String-Variable danken, weil von dieser kann ich dann auch alles andere ableiten.

    So einfach wie SeppJ tut ist das nicht.

    Übrigens sollte man erst mal klären, wie die Daten gespeichert werden sollen. Binär? Text? XML?...



  • super unnütz schrieb:

    ...
    Übrigens sollte man erst mal klären, wie die Daten gespeichert werden sollen. Binär? Text? XML?...

    Das ist eigetnlich egal, hier würde ich die einfachste Lösung bevorzugen. Weil in dieses Datenbank wird nicht reingeschaut. Wenn ich die Informationen extrahieren möchte, so werde ich im Laufe des Prozesses die notwendigen Daten z.B. in eine CSV Datei schreiben.



  • Wenn es einfach sein soll, nimm eine Serialisierungsbibliothek wie Boost.Serialization.

    Mit Streams musst du dich um unnötig viele Dinge kümmern, du musst dich auf ein Format festlegen und dieses entsprechend parsen können. Du bist damit auf ein Format eingeschränkt (mit überladenen Streamoperatoren normalerweise Text). Hingegen sind die Archive von Boost.Serialization komplett von den Serialisierungsroutinen abgekoppelt, d.h. du schreibst die Serialisierung einmal und kannst nachher diverse Archive (Text, Binär, XML) darauf anwenden. Ausserdem ist eine Möglichkeit zur Versionierung eingebaut.


Anmelden zum Antworten