Datenstructuren speichern



  • Hallo,

    wie in der Überschrift beschrieben habe ich ein Problem mit dem Speichern von Datenstructuren. Das Speichern von Strings mit "FileWrite" ist mir geläufig, aber wir kann ich eine mit "class" angelegte Datenstructur, von Strings und Integerzahlen, in eier Datei speichern.

    class myDate
    {
      public:
      int alter;
      AnsiString name;
      AnsiString geschlecht;
    };
    
    myDate testdatensatz;
    

    Bei der Suche in Foren oder bei Google bekomme ich immer nur das Speichern von einfachen Strings angezeigt.

    Ein kleines Beispiel wäre super!



  • "normalerweise" könntest du die Klasse einfach binär in eine Datei speichern und dann wieder lesen. Bei den Strings wird das allerdings nicht funktionieren, da der Stringdatenbereich nicht direkt im Speicherbereich der Klasse liegt, sondern nur ein Zeiger dahin. Du solltest dir eventuell eine neue Datenstruktur zum Speichern verwenden.

    greetz KN4CK3R



  • Erstmal Danke.
    Eine dumme Frage, wie speichert man in einer Binäre-Datei?



  • zB so:

    class test
    {
       public:
       int i;
       char c;
    };
    
    test t;
    t.i = 2;
    t.c = 'a';
    
    fstream out;
    out.open("C:\\test.conf",ios::out|ios::binary);
    out.write((void*)&t, sizeof(t));
    out.close();
    

    Sollte "00 00 00 02 61" (HEX Darstellung) in die Datei speichern

    greetz KN4CK3R



  • Hallo,

    ich habe das Beispiel übernommen und ausprobiert. Ich bekomme in der "out.write" Zeile zwei Compilermeldungen.

    [C++ Fehler] Unit1.cpp(91): E2034 Konvertierung von 'void *' nach 'const char *' nicht möglich
    [C++ Fehler] Unit1.cpp(91): E2342 Keine Übereinstimmung des Typs beim Parameter 's' ('const char *' erwartet, 'void *' erhalten)



  • dann änder das (void*) in (const char*). War mir nicht mehr ganz sicher, was er an der Stelle will.

    greetz KN4CK3R



  • Am besten du implementierst die stream operatoren >> und << für deine Klasse, Kn4ck3ers Vorschlag funktiniert nämlich nur für PODs. Sobald z.B. AnsiStrings mit von der Partie sind geht der Ansatz schief.

    #include <iostream>
    
    #include "test.h"
    
    std::ostream& operator<<( std::ostream& os, const test& obj )
    {
       // Attribute schreiben
       return os;
    }
    
    std::istream& operator>>( std::istream& is, test& obj )
    {
       // Attribute lesen
       return is;
    }
    


  • Hallo,

    Damit speicherst du natürlich im Textmode, was man ja auch bevorzugen sollte.
    Man kann natürlich auch String binär speichern. Dann muß die Länge mit vermerkt werden.

    AnsiString text; // dann irgendwie füllen
    std::ofstream out("C:\\test.conf", ios::binary);
    int size = text.Length();
    out.write(reinterpret_cast<const char*>(&size), sizeof(size));
    out.write(text.c_str(), size);
    out.close(); // nicht unbedingt erforderlich
    


  • Vielen Dank für die Hilfe.
    Ich habe mich da wohl etwas übernommen, mit dem Ziel eine Datenstructur komplett zu speichern. Ich werde versuchen, mit Euren Tips, die Daten separat zu speichern.
    Vielen Dank!



  • wenn du ne POD Struktur hast, funktioniert meine Version recht gut und is sehr flexibel in dem Rahmen. Einfach einlesen und Speicherbereich als Klasse casten, schon kannste drauf zugreifen.

    greetz KN4CK3R


Log in to reply