fwrite & fread von nem struct



  • Hi,

    mit folgendem Code möcht ich ne Struktur an unterschiedlichen Stellen per Button-Klick speichern und wieder einlesen.
    Aber irgendwie ist meine Struktur beim Speichern gefüllt und nach dem Einlesen leer. 😞
    Beim Starten der Anwendung wird die Struktur gefüllt.
    Wenn ich die Struktur mit fwrite speichere, Werte der Struktur im Dialog verändere und danach direkt wieder die ursprüngliche Struktur per fread lade, dann hab ich Sie wieder.
    Wenn ich die Struktur aber mit fwrite speichere, die Anwendung beende, die Anwendung dann nochmal starte und dann die ursprüngliche Struktur per fread lade, dann hab ich nur leere Felder.

    typedef struct
    {
    	CString vorname;
    	CString nachname;
    	CString strasse;
    	CString hausnummer;
    	CString plz;
    	CString ort;
    }ADRESSE;
    
    ADRESSE* p_Adresse; //Membervariable in MFC
    p_Adresse = new ADRESSE; //beim Initialisieren der MFC-Anwendung
    int numread = fwrite((ADRESSE*) &p_Adresse, sizeof(ADRESSE),1,fp); //beim Button Speichern
    int numread = fread((ADRESSE*) &p_Adresse, sizeof(ADRESSE),1,fp); //beim Button Laden
    

    Kann mir da jemand helfen?

    Greets



  • Lass mal das & vor p_Adresse bei fread und fwrite weg.



  • was ist CString?



  • was ist CString?

    das ist ne mfc-klasse
    ist ganz nett braucht man aber nicht wirklich weils nicht mächtiger ist als std::string...
    wenn man es denn schon in ansi durchziehen will sollte man auch std::string nehmen oder wenns c sein soll bleibt einem wohl nur ein char-array...



  • Windalf schrieb:

    ... wenns c sein soll bleibt einem wohl nur ein char-array...

    Genau auf das wollte Shade hinaus. Lies mal nach in welchem Forum dieser Thread ist. 😉



  • Du kannst auf diese Weise keine Klasseninstanzen innerhalb von structs speichern! Dass es in deinem ersten Fall funktioniert, ist reiner Zufall. Du weist ja nie wie diese Klasse intern arbeitet. Wenn CString zB. irgendwie Zeiger abspeichert, zeigen die nach Programneustart und struct-Laden ins Nirvana. Am einfachsten ist es wohl, wenn Du char[32]-Felder nimmst. (Bei char* haettest Du das Problem, dass Du Zeiger abspeicherst, aber nicht die Daten).
    -Gunnar



  • Eigentlich war der Grund das ich gefragt habe nicht der, dass es dann nicht ins C Forum passt, sondern eher der, dass man Klassen wie zB CString nicht mit fwrite speichern kann.

    Denn CString beinhaltet sicher nur einen Zeiger auf den Speicherbereich - also ist im Prinzip 'nur' ein char* - wenn man jetzt fwrite macht, wird die Adresse auf die der char* zeit, in die Datei geschrieben (nicht aber der String selbst)



  • Shade Of Mine schrieb:

    Eigentlich war der Grund das ich gefragt habe nicht der, dass es dann nicht ins C Forum passt, sondern eher der, dass man Klassen wie zB CString nicht mit fwrite speichern kann.

    Denn CString beinhaltet sicher nur einen Zeiger auf den Speicherbereich - also ist im Prinzip 'nur' ein char* - wenn man jetzt fwrite macht, wird die Adresse auf die der char* zeit, in die Datei geschrieben (nicht aber der String selbst)

    Ok, dann hab ich mich wohl verschätzt. Ist aber auch wirklich nicht einfach bei einer so kurzen Frage. 😉



  • Gunnar schrieb:

    Du kannst auf diese Weise keine Klasseninstanzen innerhalb von structs speichern! Dass es in deinem ersten Fall funktioniert, ist reiner Zufall. Du weist ja nie wie diese Klasse intern arbeitet. Wenn CString zB. irgendwie Zeiger abspeichert, zeigen die nach Programneustart und struct-Laden ins Nirvana. Am einfachsten ist es wohl, wenn Du char[32]-Felder nimmst. (Bei char* haettest Du das Problem, dass Du Zeiger abspeicherst, aber nicht die Daten).
    -Gunnar

    Hi Gunnar,
    danke für Deinen Beitrag. Klingt logisch was Du da geschrieben hast.
    Wenn ich aber mehrere Dialoge mit jede Menge Eingabefeldern hab, bei denen überall CString-Typen hinterlegt sind? Da müsste ich ja ständig von char[...] nach CString umwandlen, oder nicht? Gibt es da vieleicht noch andere Möglichkeiten eine Struktur zu speichern, außer mit fwrite(fread) ?

    Greets
    Arjen



  • Ja die einzelnen CStrings mit fprintf() speichern.



  • Es handelt sich bei mir übrigens eigentlich um ein MFC-Projekt (C++)
    Hab nur leider keine Ahnung was mir C++ bzgl. Laden und Speichern von Strukturen schönes anbieten kann.

    Jetzt gehört es schon fast nicht mehr in dieses Forum ANSI C;)

    Greets
    Arjen



  • Für die Dateiverarbeitung unter C++ schau dir mal die iostream an. Aber ich bezweifle, dass es ne Methode zum Speichern von Strukturen gibt. Außerdem verwendet man in C++ Klassen ;). Ich schätze mal du wirst nicht drum rum kommen die Strings einzeln zu speichern.


Anmelden zum Antworten