Mehrere Instanzen einer Klasse abspeichern (2)



  • Hallo Zusammen,

    Ich habe gestern bereits unter diesem Titel gepostet, und es wurde mir bereits sehr geholfen. Da das Thema mitlerweile sehr lang geworden ist, beginne ich hier neu.

    hier nochmals mein Program:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    class element
    {
    public:
    int a;
    string s;
    element*next;
    
    friend ostream& operator<<(std::ostream& os, element const& e)
        {
            os<<e.a<<e.s;//<<e.next;
    
             return os; // Referenz auf Stream zurückgeben -> damit os << a << b << c möglich wird
        }
    
    friend istream& operator>>(std::istream& is, element& e)
        {
             is>>e.a;//>>e.s;//>>e.next;
    		 std::getline(is,e.s);
             return is; 
        }
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    element m,n;
    m.a=7;
    m.s="hallo welt";
    
    n.a=5;
    n.s="hello";
    
    std::ofstream os("Bla.txt");
    os << m;
    os<< n;
    os.close();
    
    std::ifstream stream("Bla.txt");
    element k,l;
    stream >> k;
    stream >>l;
    
    cout<<k.a<<"   "<<k.s<<endl;
    cout<<l.a<<"   "<<l.s<<endl;
    }
    

    Das einzige, was ich geändert habe ist Zeile 25, sodass ich den String jetzt neu als Zeile lese.
    Noch immer habe ich das Problem (so vermute ich jedenfalls), dass in Zeile 50 ¨
    das Program nicht erkennt, wo k.s zu ende ist und wo l.a beginnt.
    Wie kann man das lösen?

    Die Instanz l sollte in Zeile 50 die Werte von n übernehmen, aber das funktioniert nicht. Wer kann mir helfen?



  • Meine Frage wurde zwischenzeitlich beantwortet. somit bitte keine Antworten mehr schreiben.
    Besten Dank an alle, die mir hier gehlfen haben.



  • Wie im anderen Thread angedeutet musst du deinen Code so erweitern, dass die Elemente voneinander getrennt sind.

    Am besten erledigst du das direkt im Operator:

    friend ostream& operator<<(std::ostream& os, element const& e)
        {
            os << e.a << " ";
    		os << e.s << "\n";//<<e.next;
    
             return os; // Referenz auf Stream zurückgeben -> damit os << a << b << c möglich wird
        }
    

    So ist die Zahl durch ein Leerzeichen getrennt und der std::string durch eine Leerzeile. So weiß der Stream wie weit er lesen muss und du hast damit die Trennung realisiert.

    Dann kannst du auch problemlos schreiben:

    os << m;
    os << n;
    

    Wichtig ist, dass das Leerzeichen auch hinter der Zahl ist. Denn die Datei würde für a = 44 und s = 123Text so aussehen:
    44123Text

    Beim Auslesen wüdest du als Zahl dann fälschlicherweise 44123 erhalten.



  • Ja, jetzt versteh ich es.
    Auch kann ch jetzt die datei mit dem editor öffnen und mir so einen überblick verschaffen.
    Du hast mir wirklich sehr geholfen.
    Besten Dank auch an Sone und alle, die mir geholfen haben


Anmelden zum Antworten