Mehrere Nicht-POD Instanzen in eine Datei schreiben
-
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.