1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Datenstruktur speichern und laden

  • Stephe
  • 25. November 2008 um 18:56
  • Unerledigt
  • Stephe
    24
    Stephe
    Mitglied
    Reaktionen
    43
    Punkte
    6.038
    Beiträge
    968
    • 25. November 2008 um 18:56
    • #1

    Ich spiel mich grad mit Speichern und Laden von Datenstrukturen in VC++ 2005. Dazu soll eine Liste des Typs "TFPoint" (eigene Klasse) gespeichert und geladen werden können. Aber egal wie lang diese Liste ist, die Datei wird zwar geschrieben, ist aber immer nur 24Byte groß. :frowning_face: Dementsprechend funzt das Laden dann natürlich auch nicht.

    (Der Code ist von einem Tutorial abgewandelt)

    Code
    struct filestructure
    {
        std::list<TFPoint> points;
    };
    
    
    void TransferFunction::save(std::string filename, std::list<TFPoint> gui_points)
    {
        filestructure fs;
        fs.points = gui_points;
        std::string name = "dat/" + filename + ".stf";    
        std::ofstream f;
    
    
        f.open(name.c_str());
        f.write((char *)(&fs),sizeof(fs)); 
        f.close();
    }
    
    
    std::list<TFPoint> TransferFunction::load(std::string filename)
    {
        std::string name = "dat/" + filename + ".stf";
        std::ifstream f;
        filestructure fs;
    
    
        f.open(name.c_str());
        f.read((char *)(&fs),sizeof(fs)); 
        f.close();
    
        return fs.points;
    }
    Alles anzeigen

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 25. November 2008 um 20:07
    • #2
    Zitat von Stephe

    24Byte


    Mit deinem write schreibst du nur die tatsächlich in deiner Struktur enthaltenen Bytes, das sind im Wesentlichen eine Handvoll Pointer auf irgendwelche anderen Strukturen, wo der logische Inhalt der Struktur steht. Automagisch serialisiert wird da nix. Insbesondere nicht, wenn du den Typ deiner Struktur wegcastest, damit man ja keine Serialisierungsmethode aufrufen könnte, selbst wenn es eine gäbe...

    Ich tät über die Liste iterieren und die Elemente einzeln ausgeben. Man kann hierfür den << -Operator entsprechend überladen, wenn man das geil findet. Man muß aber trotzdem die Elemente einzeln anfassen.

    *plantsch*

  • Fup
    12
    Fup
    Mitglied
    Punkte
    1.460
    Beiträge
    291
    • 25. November 2008 um 20:14
    • #3

    Was genau erwartest du dir von: (char *)(&fs) ? Woher soll der Compiler wissen, was er auf einen char C-Cast für eine "unbekannte" Struktur liefern soll! (Info: ostream& write ( const char* s , streamsize n ); )

    Vielleicht solltest du dir mal Serialisierung ansehen und überlegen wie die Daten in deiner Datei landen sollen.

    mfG Fup

  • Stephe
    24
    Stephe
    Mitglied
    Reaktionen
    43
    Punkte
    6.038
    Beiträge
    968
    • 25. November 2008 um 21:02
    • #4

    Tja ich komm halt aus der Java-Welt, da geht das alles viel einfacher :winking_face:
    Dann werd ich halt jedes Element einzeln speichern, weil ichs so geil find :shinner:

  • Stephe
    24
    Stephe
    Mitglied
    Reaktionen
    43
    Punkte
    6.038
    Beiträge
    968
    • 26. November 2008 um 11:04
    • #5

    So, hab das jetzt mal total basic versucht, und es geht trotzdem nicht, obwohls zu 100% aus einem Tutorial genommen wurde:

    Code
    //speichern
    std::string name = "dat/" + filename + ".stf";    
    std::ofstream out(name.c_str());
    int pointcount = gui_points.size();
    
    
    out << pointcount;
    out.close();
    
    
    //laden
    std::ifstream in(name.c_str());
    int pointcount;
    
    
    in >> pointcount; 
    in.close();
    Alles anzeigen

    Die Datei wird richtig gespeichert, der Integer steht drinnen. Aber beim Laden wird -85899blabla ausgelesen :confused:

    Einmal editiert, zuletzt von Stephe (26. November 2008 um 11:09)

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 26. November 2008 um 11:41
    • #6

    magst du deine daten nicht einfach in ein binary-file schreiben? hier ein beispiel wie man eine struct ein/auspackt.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Stephe
    24
    Stephe
    Mitglied
    Reaktionen
    43
    Punkte
    6.038
    Beiträge
    968
    • 26. November 2008 um 11:55
    • #7

    :hewa::shout:

    Ich Dumpfgummi hab der Methode die Dateiendung schon übergeben und habs nochmal hinzugefügt. Jetzt gehts. Habs mit der binären Methode gemacht, die ich auch schon vorher probiert hab.
    Trotzdem danke!

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 26. November 2008 um 12:00
    • #8

    aus dem grund postet man nach moeglichkeit auch vollstaendigen code :face_with_tongue:

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 26. November 2008 um 19:10
    • #9
    Zitat von Kampi

    magst du deine daten nicht einfach in ein binary-file schreiben?


    Also grad von dir hätt ichin grad diesem Thread so einen Rat nicht erwartet :) Binäre Files sind weniger portabel, nehmen möglicherweise nur unwesentlich weniger Platz ein (falls überhaupt), und, wie der Anfang des Threads zeigt, ist das naive Dumpen von Bytes oft nicht das, was man sich als tatsächliche Operation wünscht.

    *plantsch*

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 27. November 2008 um 07:31
    • #10
    Zitat von Plantschkuh!

    Binäre Files sind weniger portabel, nehmen möglicherweise nur unwesentlich weniger Platz ein (falls überhaupt), und, wie der Anfang des Threads zeigt, ist das naive Dumpen von Bytes oft nicht das, was man sich als tatsächliche Operation wünscht.

    Ja! Am besten gleich XML rausschreiben (mit libxml2 zB)!

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 27. November 2008 um 14:41
    • #11
    Zitat von Plantschkuh!

    Also grad von dir hätt ichin grad diesem Thread so einen Rat nicht erwartet :)

    hmm, verdammt, wie argumentier ich mich da jetzt raus? :winking_face: so lange das format gut spezifiziert und bekannt ist, wovon ich natuerlich ausgegangen bin, ist ja nicht viel verloren, dann kann man die daten ja auch mit FOSS wieder raus holen.

    aber ja, was den rest betrifft, habt ihr natuerlich vollkommen recht. fuer ernstzunehmende programme gibt es bei weitem sinnvollere moeglichkeiten.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung