Variable in eine Datei speichern und Objekt zuweisen



  • 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