Struct mit dyn Member schreiben



  • Hallo Leute,

    ich hab keinen Anwendungsfall, nur eine kurze Überlegung:

    Angenommen ich habe folgende Struct :

    struct data{
           int  value;
           char *text;
    };
    
    typedef struct data V1;
    

    Jetzt wird *text und der INT -Wert "gefüllt"...

    V1 test;
    
    test.value=5;
    test.text=malloc(200);
    fgets(test.text, 200, stdin);
    

    Kann ich die Struktur dann so in einen Datei schreiben???:

    FILE *write;
    
    write=fopen("nix.txt", "w");
    fwrite(&test, sizeof(test), 1, write);
    

    liefert sizeof(test) dann den "gemallocten" Wert mit?


  • Mod

    Nein. Das funktioniert ganz und gar nicht. Weder wird ein Zeiger irgendwie "größer" wenn du ihm einen malloc-Wert zuweist, er zeigt nur woanders hin. Noch folgt fwrite einem Zeiger. Das heißt, du schreibst den Zahlenwert des Zeigers raus, was relativ nutzlos ist.



  • Tja, das dachte ich mir schon.
    Wie wäre das dann zu lösen? Ich könnte den String mit fputs schreiben...
    Aber die Struktur als Block, incl. String???



  • Stichwort: Serialisierung (auch wenn man dies eher in anderen Sprachen so bezeichnet...)

    Am besten, zuerst die Länge rausschreiben und dann dahinter den String:

    void WriteString(FILE *f, const char *str)
    {
      size_t len = strlen(str) + 1; // wegen abschließendem Null-Terminierungszeichen
      fwrite(&len, sizeof(len), 1, f);
      fwrite(str, len, 1, f);
    }
    

    Dies mußt du aber explizit für jeden einzelnen char* durchführen (geht also nicht automatisch).
    Und beim Einlesen eben genau umgekehrt, erst Länge lesen, dann Speicher dafür allozieren und dann den String in den Speicher einlesen.



  • Guter Ansatz. Danke erstmal.
    Schade das es nicht so "einfach" mit kompletter Struct geht

    Noch was anderes :
    Aus "http://www.cplusplus.com/reference"

    /* fwrite example : write buffer */
    #include <stdio.h>
    
    int main ()
    {
      FILE * pFile;
      char buffer[] = { 'x' , 'y' , 'z' };
      pFile = fopen ("myfile.bin", "wb");
      fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
    // fwrite(buffer, sizeof(buffer), 1, pfile)  // kommt aufs gleiche raus oder?
      fclose (pFile);
      return 0;
    }
    


  • sizeof(char) ist immer 1.

    Zu deiner Frage: sofern du es noch nicht weißt, fwrite(3) gibt die Anzahl der erfolgreich geschriebenen Elemente zurück. In den von dir genannten Fällen ist das:

    fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
    

    Gibt zwischen 0 und sizeof(buffer) zurück.

    fwrite(buffer, sizeof(buffer), 1, pfile)
    

    Gibt 0 oder 1 zurück.

    Das ist der einzige Unterschied. Wenn dich also teilweiser anstatt vollständiger Erfolg interessiert (was deinen Code leider egal ist), musst du ersteres verwenden.



  • (was deinen Code leider egal ist),

    Der ist aus der Referenz, nicht von mir

    Ich benutze bis jetzt immer diese Version

    fwrite(buffer, sizeof(buffer), 1, pfile)
    

    ... weil sie mir "sprachlich" mehr zusagte.. (schreibe buffer, größe von buffer, 1 mal nach pfile).


Log in to reply