Help Wanted: class to file

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Help Wanted: class to file

    Servus!
    Mein Problem ist eigentlich mal wieder so common, dass man meinen sollte, Dokumentationen oder HowTos ergooglen zu können. Da es damit leider essig ist und ich hier auch nicht wirklich was passendes gefunden hab frag ich halt mal blöd in aller knäppe:

    Meine Klasse (VC++ 2005 .NET) sieht so aus:

    Quellcode

    1. ref class setup
    2. {
    3. public:
    4. System::String^ port;
    5. int baudrate;
    6. System::String^ parity;
    7. int databits;
    8. System::String^ handshake;
    9. setup()
    10. {
    11. }
    12. ~setup()
    13. {
    14. }
    15. };
    Alles anzeigen

    Nun erzeuge ich eine instanz als:

    Quellcode

    1. gcroot<setup^> current_setup;



    , öffne auch noch eine Datei:

    Quellcode

    1. FILE *dh_configfile = NULL;
    2. fopen_s(&dh_configfile, "config.dh", "w");



    Und das hier würde ich jetzt gerne können:

    Quellcode

    1. put_das_objekt_in_die_datei(current_setup, dh_configfile);




    Vorschläge? T_T

    EDIT: Kann das Teil auch gerne in ein struct umbasteln... war eh meine ursprüngliche Idee.
    Hey morons, let's get a move on before the other moron does something especially moronic.
  • Ich würde nicht die ganze Klasse in eine Datei speichern (Speicherabbild oder sowas), sondern eher die Informationen, die du brauchst um die Klasse neu zu instanzieren. Schreib dir eine Methode zum speichern und eine zum laden der Konfiguration und gut ist.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Naja nicht ganz. Durch speichern einer Anleitung zu Erstellung der Instanz (ini, xml,...) erhälst du dir die Möglichkeit, dein Programm für andere Architekturen zu compilieren und die die Programmversionen kompatibel zueinander sind. Hinzukommt, das man lesbare Dateien besser debuggen kann. Außerdem kann man aus beschädigten Dateien manchmal noch Informationen retten.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Okok, hast ja recht :)
    Nur kenn ich mich mit diesen strukturen noch net so aus und ich werde in diesem Projekt wohl auch net die Zeit haben, allzuviel was nicht unbedingt sein muss zu lernen ^^

    Aber was mich jetzt doch interessiert:
    gegeben sein folgender Code...

    Quellcode

    1. FILE *fptr = NULL;
    2. long j = 0;
    3. for (long i = 0; i < 10000; i++)
    4. {
    5. fptr = fopen("xxx.dh", "w");
    6. fwrite(&i, sizeof(i), 1, fptr);
    7. _fcloseall();
    8. fptr = fopen("xxx.dh", "r");
    9. fread(&j, sizeof(j), 1, fptr);
    10. _fcloseall();
    11. if (i != j) cout<<i<<"\t"<<j<<"\n";
    12. }
    Alles anzeigen


    Performant sein soll das ganze nicht... dass ich die datei auf und zu knall hat damit zu tun, dass ich das spätere Speicher- und Ladeverhalten im eigentlichen Programm nachstellen wollte.

    Problem: Wenn alles glatt läuft, sollte keine ausgabe kommen. Leider kommt eine Ausgabe. Und zwar haben die Zahlen, die nicht ordnungsgemäß gespeichert werden scheinbar alle die Bitkombination 11010, wobei 1010 ein komplettes Halbbyte belegt (also nur die Bits 0-3, 4-7, 8-11 usw... nicht aber z.B. 2-5) und beim Laden zu 1001 wird. (Ich habe auch noch Zahlen dabei, für die das nicht zutrifft, z.B. 3565, die auf 1101 endet, welches zu 1100 wird... aber für das Gros trifft 11010 zu.)
    Tritt der Fehler auf, so ist die ausgegebene Datei 5 Byte (bei Erfolg 4 Byte) gross und hat einen Zeilenumbruch drinnen.

    Gelesen wird die korrupte Datei dann nur bis zu der Stelle an der der Fehler war... der Rest der Variablen in die geladen wird bleibt im Ausgangzustand.
    Ein Beispiel (gespeichert werden sollte 6666):

    j = 0;
    fread(&j, sizeof(j), 1, fptr);

    führt zu j = 10

    j = 6666;
    fread(&j, sizeof(j), 1, fptr);

    führt zu j = 6410



    Getestet habe ich das unter XP auf VC++ 2005 Express und Borland 6 und unter Win2000 auf Borland 6.
    Hat jemand ne Idee, was da schief läuft? O_o
    Weil.. ich wüsst net, nach was ich da googlen sollte ^^
    Hey morons, let's get a move on before the other moron does something especially moronic.
  • Das Problem ist, dass du die Dateien nur mit "r" bzw "w" öffnest.
    Hier müsstest du "rb" und "wb" verwenden um ohm zu sagen, dass es binäre Dateien sind.
    Standarmäßig nimmt er Textdateien an (\n <-> \r\n Issue)

    Working Code VC 2005:

    Quellcode

    1. #define _CRT_SECURE_NO_DEPRECATE
    2. #include <stdio.h>
    3. #include <iostream>
    4. using namespace std;
    5. int main ()
    6. {
    7. FILE *fptr = NULL;
    8. long j = 0;
    9. for (long i = 0; i < 10000; i++)
    10. {
    11. fptr = fopen("xxx.dh", "wb");
    12. fwrite(&i, sizeof(i), 1, fptr);
    13. fclose(fptr);
    14. fptr = fopen("xxx.dh", "rb");
    15. fread(&j, sizeof(j), 1, fptr);
    16. fclose(fptr);
    17. if (i != j) cout<<i<<"\t"<<j<<"\n";
    18. }
    19. return 0;
    20. }
    Alles anzeigen


    Note: _fcloseall () ist sch...e -> immer das Handle angeben -> viel schneller und sicherer!