Variable in eine Datei speichern und Objekt zuweisen



  • Hallo!

    Ich habe eine Klasse mit mehreren Variablen. Diese sollen nun in ein Datei gespeichert werden. Alle Tutorials die ich im Netz gefunden haben zeigen mir wie ich ein String in eine txt Datei speichere. Was mir nicht sonderlich hilft.

    Ich möchte einfach nur ein Objekt erstellen. Die Daten in die Datei speichern. Später würde ich dann gerne die Datei öffnen und die Daten wieder zuweisen können.

    Habs schon mit der Suche versucht.

    variable datei
    variable*
    datei*
    variable* in datei

    haben bisher keine brauchbare Lösung erbracht.

    Wenn ihr nen guten Link habt wär das schon hilfreich. Ich versuch mich dann dort durch zu boxen 🙂 .

    Gruß
    Croatiancow



  • Hallo

    Wenn du weißt, wie man strings und andere Variablen in einer Datei speichert, dann kannst du doch einfach alle Member deiner Klasse in einer Datei speichern.

    Schau dir dazu ofstream und ifstream an.

    chrische



  • Wenns nicht zu Lernzwecken ist kannst du dir Boost.Serialization anschauen.



  • Nein es dient nicht zu lernzwecken.
    Mit dem Boost komm ich irgendwie nicht klar.

    Ich Schaffe es zwar mi diesem Code

    ofstream outfile;
      outfile.open ("test.txt");
      outfile.write("test",4);
    
      outfile.close();
    

    Einen String in die Datei zu schreiben, mit einer Variable gehts aber nicht.

    Ich habs mit nem einfachen int versucht. Auch ein

    IntToStr()
    

    hat nicht geholfen.

    Danke für eure mühe



  • Mal als Beispiel

    int i = 4;
    double d = 4.7;
    ofstream outfile("test.txt", ios::binary);
    outfile.write(reinterpret_cast<const char*>(&i),sizeof(i));
    outfile.write(reinterpret_cast<const char*>(&d),sizeof(d));
    

    Du mußt dir bewußt sein, dass write binär rausschreibt. Wenn du Text haben willst reichte ein einfaches.

    int i = 4;
    double d = 4.7;
    ofstream outfile("test.txt");
    outfile << i << " " << d;
    


  • Croatiancow schrieb:

    Mit dem Boost komm ich irgendwie nicht klar.

    Wo liegt denn das Problem?

    mfg.



  • Da er IntToStr() erwähnt hat, denke ich mal, dass er mit dem BCB arbeitet. Die Installation der meisten boost Bibliotheken ist da kein Problem (zumindest beim BCB5 und 6). Das trifft aber nicht auf serialization zu. Es ist zwar möglich das zu installieren, aber nicht einfach (benötigt spirit 1.6.).
    Ich halte boost::serialization für das einfach Speichern einer struct aber für overkill. Das einfache Schreiben von read/write-Memberfunktionen für diese struct ist einfacher.



  • ISBN: 3028844177666

    kaufen, lesen, danach kannst du variablen in eine datei schreiben



  • Ich habe es mit Boost versucht aber irgendwie findet er die Dateien nicht. Später habe ich das mit dem spirit 1.6 gelesen. Irgendwann wurde es aber zuviel arbeit. Ich mein es muss doch auch einen "Fußweg" geben. Daten rein, später wieder raus. Fertig.

    Vorschlag von Braunstein klingt gut. Ich habe das mit dem String schon hingekriegt. Könntet ihr mir vielleicht den unten stehenden Befehl erläutern?
    mir macht nur das "reinterpret_cast<const char*>" sorgen. Was ist das??

    outfile.write(reinterpret_cast<const char*>(&i),sizeof(i));
    

    Es stellt sich auch die frage wie ich das wieder abrufe??

    Was wird denn als Trennzeichen benutzt??

    Grüße aus Kroatien 🙂



  • Der reinterpret_cast wandelt die Adresse deiner Variable in ein const char* um, weil genau das bei write verlangt wird. write schreibt also soviele Bytes wie in size angegeben von dieser Position in deine datei. Die Umkehrung dazu heißt read.

    infile.read(reinterpret_cast<char*>(&i),sizeof(i));
    

    Hier mußt du in char* casten da du ja auf die Position deiner Variable schreiben willst.

    Noch ein Hinweis zu strings. Das Rausschreiben geht hier zwar sehr einfach, es gibt aber Probleme beim Einlesen. read braucht nämlich die zu lesende Anzahl und die hast du ja normalerweise nicht. Du mußt also hier zuerst die Anzahl der Zeichen im string rausschreiben und dann den string selbst. Beim Einlesen geht man dann umgekehrt vor.

    string test("Hallo");
    size_t len = test.size();
    outfile.write(reinterpret_cast<const char*>(&len),sizeof(len));
    outfile.write(test.c_str(),len); // hier kein cast nötig da c_str() const char* liefert
    //einlesen
    size_t len;
    infile.read(reinterpret_cast<char*>(&len),sizeof(len)); //Länge einlesen
    char* buffer = new buffer[len+1]; //entsprechenden Puffer zum Einlesen erzeugen
    infile.read(buffer,len); //in den Puffer einlesen
    buffer[len] = '\0'; // Nullterminierung an das Ende schreiben
    string text = buffer; //Puffer in den string überführen
    delete[] buffer;
    

    Du kannst dir das aber alles vereinfachen, indem du die Streamoperatoren (<< >>) verwendest und im Textmodus schreibst und liest. Die Datei wird zwar größer, dafür ist das schreiben und lesen einfacher und leichter zu debuggen.



  • Hallo nochmal 😉

    Ich habe das schreiben in die Datei hinbekommen. Ich krieg aber das Auslesen nicht hin.

    Beispiel:

    ofstream outfile("test.txt");
     Artikel art;
     art.price=78.9;
     art.bezeichnung="Artikelbeschreibung";
     int len=strlen(reinterpret_cast<const char*>(art.bezeichnung.data()));
     outfile.write(reinterpret_cast<const char*>(IntToStr(len).data()),2);
     outfile.write("-",1);
     outfile.write(reinterpret_cast<const char*>(art.bezeichnung.data()),art.bezeichnung.Length());
     outfile.write("\n",1);
     outfile.write("04-",3);
     outfile.write(reinterpret_cast<const char*>(FloatToStr(art.price).data()),4);
    

    Die Textdatei bleibt bei dieser Formatierung übersichtlich und "Durchschaubar".
    Wenn ich auslesen will muss ich den Coursor auf "Seek_Set" setzen. Damit ich von vorne Anfange.

    Zuerst lese ich die Länge des String aus. IMMER im format XX-"String";
    Springe dann an Position 3 in der Aktuellen Zeile und lese per Schleife aus.

    Meine Frage:

    Wie mache ich das am besten OHNE das Programm langsam zu machen?
    Wie teile ich dem Coursor mit das er rumspringen soll?
    Jetzt benutze ich statt "ofstream" "ifstream" richtig??

    Ihr könnt auch gerne verlinken. Es sollte halt meine Frage(n) beantworten oder weiterhelfen.
    Danke für eure Hilfe



  • Du mußt eigentlich nicht hin und herspringen wenn alle Objekte schön hintereinander abgelegt sind. Ohn Code (zum Auslesen) kann man hier aber nicht viel sagen.


Anmelden zum Antworten