struct mit String in Datei schreiben



  • er muss char* benutzen wenn er eine struktur abspeichern will. Versuch du mal einen std::string abzuspeichern welche den speicher Dynamisch allokiert. Er muss den Speicher Statisch allokiert haben, sonst bekommt er fehlausgaben oder sein PC fliegt aus dem Fenster dank systemabstürzen.

    Stimmt, im Bezug auf Dateien hatte ich char* hier gar nicht bemerkt, hast Recht.

    Kurz: Nur Buildintypes sind möglich.

    Das allerdings stimmt nicht unbedingt, man kann sehr wohl auch Klassen nehmen, die dann allerdings keine Zeiger o.Ä. enthalten dürfen.

    EDIT: D.h. POD Typen sind möglich.

    MfG Eisflamme



  • Hi

    Also ich nehm jetzt die std::ofstream Klasse zum speichern. structs benutz ich übrigens nur um es übersichtlicher zu machen.

    Das char * speicher ich jetzt so ab:

    struct filestruct
    {
    int StrLen;
    char * Str;
    }
    
    Str = "Test.bmp";
    StrLen = strlen(Str);   // jaja, C-Funktion :)
    
    ofstream.write((char*)&StrLen, sizeof(int)); // Länge schreiben
    
    for (int i = 0; i < StrLen; i++)
    {
     ofstream.put(Str[i]);  // Zeichen für Zeichen schreiben
    }
    

    Wahrscheinlich würde ein stl String auch gehen aber warum? char * reicht auch und ist wahrscheinlich genau so schnell

    Daniel



  • DanielD schrieb:

    Hi

    Also ich nehm jetzt die std::ofstream Klasse zum speichern. structs benutz ich übrigens nur um es übersichtlicher zu machen.

    Das char * speicher ich jetzt so ab:

    struct filestruct
    {
    int StrLen;
    char * Str;
    }
    
    Str = "Test.bmp";
    StrLen = strlen(Str);   // jaja, C-Funktion :)
    
    ofstream.write((char*)&StrLen, sizeof(int)); // Länge schreiben
    
    for (int i = 0; i < StrLen; i++)
    {
     ofstream.put(Str[i]);  // Zeichen für Zeichen schreiben
    }
    

    Wahrscheinlich würde ein stl String auch gehen aber warum? char * reicht auch und ist wahrscheinlich genau so schnell

    Daniel

    Nimm statt dem C-Cast, static_cast<>() in diesem Falle oder aber wenn es sein
    muss dynamic_cast<>() oder reinterpret_cast<>().

    Warum schreibst du die Zeichenkette Zeichen fuer Zeichen in die Datei? Die
    kannst du getrost auch mittels << oder .write() in die Datei schreiben.

    mfg
    v R



  • Nimm statt dem C-Cast, static_cast<>() in diesem Falle oder aber wenn es sein
    muss dynamic_cast<>() oder reinterpret_cast<>().

    Warum schreibst du die Zeichenkette Zeichen fuer Zeichen in die Datei? Die
    kannst du getrost auch mittels << oder .write() in die Datei schreiben.

    mfg
    v R

    mmh, also .write(Str, StrLen), oder?
    Daran hab ich gar nicht gedacht 🙂
    Was für einen Cast meinst du?

    Daniel



  • Ich meinte diesen Cast:

    ofstream.write((char*)&StrLen, sizeof(int));
    //wuerde ich so schreiben
    ofstream.write(static_cast<char*>(&StrLen), sizeof(int));
    

    mfg
    v R



  • virtuell Realisticer schrieb:

    Ich meinte diesen Cast:

    ofstream.write((char*)&StrLen, sizeof(int));
    //wuerde ich so schreiben
    ofstream.write(static_cast<char*>(&StrLen), sizeof(int));
    

    mfg
    v R

    Ah, Ok
    Danke für deine Hilfe

    Daniel



  • Hm, also wenns variabel sein soll, dann schreib einfach erst die länge des
    Strings in die Datei, und danach den string selber. Oder mach aus jedem String
    eine Zeile, dann kannst du den wieder mit getline einlesen.

    Devil



  • struct MyStruct
    {
       int X, Y;
       string VarStr;
    };
    
    ostream & operator << (ostream & os, const MyStruct & foo)
    {
       os 
          << foo.X 
          << ...
          << foo.VarStr.length()
          << foo.VarStr;
    }
    
    ...
    
    MyStruct myStruct
    ofstream datei ("...");
    datei << myStruct;
    

    Fertig. Ne, moment, das wäre irgendwie trivial, darum kanns hier nicht gehen. Worum geht's hier eigentlich? 😕



  • @helium nein so klappt das nich, damit bin auch ich erst vor kurzem auf die nase geflogen.
    du kannst in die datei zwar so reinschreiben,aber selbst bei aktiviertem binary flag schreibt der << operator jeden wert als char wert.



  • Ist klar. Als char-Wert. LOL.

    Wenn ich einen int an den Stream schicke, dann kommt da auch ein int rein. Im textmodus eben als Zahl, im Binärmodus als vier Bytes (32Bit System). Genau so siehts mit Strings aus. Strings sind quasi Ketten von chars, sehen also im Text und Binärmodus gleich aus, bis auf möglicherweise newlines. (windows: \r\n ...)


Anmelden zum Antworten