Mehrere Nicht-POD Instanzen in eine Datei schreiben
-
Ja, was wollt ihr denn? Auf Seite 1 hab ich doch Alle relevanten Codes zusammengefasst gepostet. Ich kann ja nicht elementare Bestandteile des Fehlercodes rauslassen. Könnte sich ja immerhin um den Fehler handeln!
Was versteht ihr denn unter einem Beispiel?! Wenn da der Code zum Speichern steht, da der zum Laden, zwischen den Aufrufen nichts mehr passiert, wird es ja wohl mehr als wahrscheinlich einen Fehler in einer dieser Funktionen geben.
Nun gut, hier also nochmal die Codes, aber fast genauso wie auf der vorherigen Seite. MMn kann man da nicht viel kürzen, ohne dass man eventuell den Fehler rauskürzt:
Hier Alles, in einem kurzen Code.
#include <iostream> #include <fstream> using namespace std; class player // KLASSE { private: // DEKLARATIONEN // int TEST1, TEST2; public: friend istream& operator>> (istream& Stream, player& B); friend ostream& operator<< (ostream &Stream, player& B); }; ostream& operator<<(ostream &Stream, player& B){ Stream << B.TEST1 << B.TEST2; return Stream; } istream& operator>>(istream &Streamm, player& B) { Streamm >> B.TEST1 >> B.TEST2; return Streamm; } bool save() // FUNKTION ZUM SPEICHERN{ fstream playeroutput; playeroutput.open("pl.dat", ios::out | ios::trunc); playeroutput << ::malark; playeroutput.close(); } bool load(){ fstream input; input.open("pl.dat", ios::in); input >> ::malark; input.close(); } int main(){ Player malark("Malark"); save(); load(); return 0: }
-
fstream playeroutput; playeroutput.open("pl.dat", ios::out | ios::trunc); playeroutput << ::malark; playeroutput.close();fstream input; input.open("pl.dat", ios::in); input >> ::malark; input.close();Aua. Lässt sich vereinfachen zu
ofstream playeroutput("pl.dat", ios::trunc); playeroutput << ::malark;ifstream playeroutput("pl.dat"); playeroutput >> ::malark;Und was soll
::malark? Der Scope-Operator wird so bei globalen Variablen verwendet.malarkist eine scope-lokale Variable vonmain(). Eher*this.Edit(³): Eigentlich muss der ausgabe-Operator ja eine konstante Referenz haben, genau wie die
save()-Funktion (die du als Methode hinzufügen solltest) denconst-qualifier.
-
Ach, und nochwas. Zwischen den Ausgaben des Ausgabe-Operators muss ein Leerzeichen, da sonst so geschrieben wird (mit zwei ints 3 und 45):
a << b; -> ab ->"345" und nicht "3 45"
-
Und wo steckt nun der Fehler? Ich weiß sehr wohl, dass der Code nicht ansatzweise professionell ist und das soll er auch gar nicht sein. Das ist nur zum Spaß. Aber auch zum Spaß sollte es schon funktionieren. Also könnt ihr mir nun bitte den Fehler nennen oder meine eine Methode aufzeigen, wie man Klasseninstanzen sonst sinnvoll speichern kann?
-
Das fehlende Leerzeichen wäre schon mal ein Anfang.
-
Gut, muss mich wohl entschuldigen. Der Code an dem ich groß gemeckert hab war ja nur ein Skript
.Also mach das hier:
ostream& operator<<(ostream &Stream, player& B) { Stream << B.TEST1 << ' ' << B.TEST2; return Stream; }Dannn sollte es bei dir klappen.
-
Gut, dass hab ich jetzt drinnen. Jedoch wirft er mir beim Laden immernoch ständig Variablen durcheinander.
ostream& operator<<(ostream &Stream, player const& B) { cout << B.aiStone << endl; Stream << B.aiGold << ' ' << B.aiFood << ' ' << B.aiIron << ' ' << B.aiStone << ' '<< B.aiWood<< ' '<< B.development<< ' ' << B.forceStrength<< ' ' << B.aiHumor << ' ' << B.aiInhabitants<< ' ' << B.prosperty<< ' ' << B.timesPlayerRejectedOffer<< ' ' << B.timesTradedWithPlayer << ' ' << B.bStatusToPlayer << ' ' << B.bStatusToPlayerAlly; cout << B.aiStone << endl; return Stream; } istream& operator>>(istream &Streamm, player& B) { B.aiStone += 30; cout << "Vorher : " << B.aiStone << endl; Streamm >> B.aiGold >> B.aiFood >> B.aiIron >> B.aiStone >> B.aiWood >> B.development >> B.forceStrength >> B.aiHumor >> B.aiInhabitants >> B.prosperty >> B.timesPlayerRejectedOffer >> B.timesTradedWithPlayer >> B.bStatusToPlayer >> B.bStatusToPlayerAlly; cout << "Nachher : " << B.aiStone << endl; return Streamm; }Sorry, diesmalmit allen Variablen, denn da wird dann ja wohl irgendwo der Fehler stecken. Testweise inkrementiere ich eine der Variablen vor dem Laden um 30 und gebe sie danach aus. Jedoch kommen da immer Werte von anderen Variablen raus.

Muss vielleicht zwischen die einzelnen Instanzen auch noch eine Art Trennmittel, wie so ein '[LEERZEICHEN]'?
playeroutput << ::malark; playeroutput << ' '; playeroutput << ::nympth;vielleicht?
-
Yayy... Das war die Lösung

Danke für eure Mithilfe!!!
-
Besser wäre einfach ein newline am Ende von der Ausgabe hinzufügen:
ostream& operator<<(ostream &Stream, player const& B) { Stream << B.aiGold << ' ' << B.aiFood << ' ' << B.aiIron << ' ' << B.aiStone << ' '<< B.aiWood<< ' '<< B.development<< ' ' << B.forceStrength<< ' ' << B.aiHumor << ' ' << B.aiInhabitants<< ' ' << B.prosperty<< ' ' << B.timesPlayerRejectedOffer<< ' ' << B.timesTradedWithPlayer << ' ' << B.bStatusToPlayer << ' ' << B.bStatusToPlayerAlly << '\n'; return Stream; }
-
Besser wären Zeilenumbrüche im Code. Aber im Grunde ist es okay dem Aufrufer zu überlassen, wie er die Ausgabe trennen will.
-
15 Member sind zu viel.