Mehrere Nicht-POD Instanzen in eine Datei schreiben
-
EiGelbb schrieb:
Hier einfach mal der ganze Code. Da wird dann ja wohl Alles drinstehen.
Meinst du es interessiert jemanden sich das alles anzusehen?
-
EiGelbb schrieb:
Hier einfach mal der ganze Code. Da wird dann ja wohl Alles drinstehen.
Ja, bestimmt. Das wird dann ja wohl auch jeder lesen, die 2000 Zeilen.
Dir wurde doch schon mehrmals gesagt, ein einfaches, gekürztes, kompilierbares Beispiel vorzuzeigen.
-
2655 Zeilen Code ... lol

http://www.c-plusplus.net/forum/200753
Reduziere Codebeispiele auf das Wesentliche. Niemand wird sich 300 Zeilen Code durchlesen, wenn du dein Problem eigentlich auch an 20 Zeilen deutlich machen könntest. Und je weniger du den Leuten zumutest desto wahrscheinlicher ist es, dass sie es sich durchlesen (und evtl. eine Antwort haben). Am Sinnvollsten ist es, den vorhandenen Code zu nehmen und Stück für Stück in eine neue Sourcecode-Datei zu kopieren, so dass er möglichst kurz bleibt und dennoch den Fehler beinhaltet. Häufig stolpert man beim Erstellen dieses minimalen Codebeispiels selbst über die Fehlerursache.
Grüssli
-
Dravere schrieb:
2655 Zeilen Code ... lol

Du hast das doch nicht ernsthaft zusammengezählt?

Egal.Zum Test addiere ich vor dem Speichern zu einer Variable +30. Beim Laden flattert mir jedoch wieder der Anfangswert entgegen.
BITTE - EIN - BEISPIEL. Warte, ich lade gleich ein von mir produziertes Code-Beispiel hoch, dass funktionieren wird.
Edit:
#include <iostream> template<typename type> class TWrapper { type value; public: TWrapper(type const& v): value(v) {} friend std::ostream& operator<<(std::ostream& os, TWrapper const& inst)//Hier muss BTW eine konstante Referenz übergeben werden (sollte) { return os << inst.getValue(); } type &getValue() { return value; } type const& getValue() const { return value; } void setValue(type const& v) { value = v; } }; int main() { TWrapper<int> a(5); a.setValue(a.getValue() + 30);//Verändere den Wert zu einem anderen std::cout << a << '\n';//Große Überraschung (?) }
-
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.