Files und Streams mit wxWidgets
-
Erstmal vielen Dank für deine Antworten
Streams scheinen mir dann nicht ganz geeignet für "Config" Files zu sein. Könnte man denn mit wxTextfile oder so nach Zeilen und/oder Wortpositionen vorgehen?
Die Doku hilft mir da irgendwie nicht weiter.Viele Grüße,
Roland
-
Für config daten gibt es doch wxConfigFile.
-
Hallo,
ich hab mich letztendlich für wxTextFile entschieden, doch leider bin ich dabei auf ein kleines Problem gestoßen:void MyFrame::OnProject(wxCommandEvent &event) { ProjectDlg* dlg = new ProjectDlg(this,-1); if(dlg->ShowModal() == wxID_OK) { wxTextFile* txt = new wxTextFile(wxT("My.sav")); if(txt->Exists()) { txt->Open(); } else { txt -> Create(wxT("My.sav")); } wxString dummy = wxT(""); wxString str = txt->GetFirstLine(); for(int i = 0; i<4; i++, str = txt->GetNextLine()) { switch(i) { case 0: dummy << dlg->PlayerXpos; break; case 1: dummy << dlg->PlayerYpos; break; //evtl. Art bestimmen default: {};/*cerr << "Error*/ } str = dummy; dummy = wxT(""); txt->Write(); } str = txt->GetLine(5); for(int i = 0; i<4; i++, str = txt->GetNextLine()) { switch(i) { case 0: dummy << dlg->PlayerXpos; break; case 1: dummy << (dlg->Player2Entf - dlg->PlayerYpos); break; default: {};/*cerr << "Error*/ //implementier ich später //default: /*cerr << "Error*/ } str = dummy; dummy = wxT(""); } txt->Write(); } }
Zur Erklärung: In der OnInit() FUnktion lege ich ein wxTextFile namens My.sav an, welches folgende 8 Werte Speichert (jeweils einen pro Zeile):
0 // Player Xpos 0 // Player Ypos Player1 // Player Name Warrior // Player Klasse 0 // Player2 Xpos 1 // Player2 Ypos Player2 // Player Name Rogue // Player Klasse
Jetzt habe ich einen Konfigurationsdialog (OnProject()) geschrieben, in dem der Spieler die X/Y Koordinaten Player1 festlegen kann und den Abstand von Player2 auf Player1 auf der Y-Achse bestimmen kann. Theoretisch soll jetzt der obige Code diese Werte übernehmen und in die anfangs generierte sav Datei schreiben. Name und Klasse werden dabei per default übersprungen und daher beibehalten (daher momentan /*cerr << error*/, weil das noch kommen soll).
Leider passiert rein gar nichts, wenn ich diesen Dialog aufrufe und die Werte veränder.Es wäre klasse, wenn man mir hier nochmal helfen könnte
Beste Grüße,
Filemacher
-
Ein Kernproblem ist wohl, ob ich korrekt in die Datei schreibe, aber ich bin mir nicht sicher.
Es wäre klasse, wenn jemand helfen könnte
-
Dein For-switch sieht etwas komisch aus.
Auch ist mir nicht klar, wie die Daten aus Dummy in der Datei landen sollen.
-
Erstmal danke nochmal für dein vielen Antworten:
Die for-switch berücksichtigt die Struktur einer "Spieler" Klasse. Da diese vier Werte enthält sollen durch die Vier möglichkeiten diese jeweils in eine Zeile geschrieben werden. Da die letzten beiden Werte in diesem Fall unangetastet werden bleiben sollen, werden sie mit default übersprungen (hoffe ich zumindest)
Wie die Daten aus dummy in der Datei landen sollen, weiss ich leider auch nicht genau (ich dachte, in dem ich sie dem str zuweise, aber dass scheint nicht der Fall zu sein).
Welche Möglichkeit gäbe es denn stattdessen?
-
Schreib direkt in die Datei. Vermeide switch Anweisungen sie sind unperformant und schlecht leserlich.
stream << value
Dies steht aber auch alles im Tutorial.
-
Vielen Dank für deine Hinweise.
Im Tutorial habe ich nur nicht verstanden, wie ich z.B. liniengenau Daten änder oder schreibe (bspw. 3. Linie durch "Text2" ersetzen).Sry für meine Newbiefragen
-
In dem du die Datei neuschreibst.
-
erstnochmal danke für deine Geduld beim beantworten meiner Anfängerfragen
Ich habe jetzt doch auf deinen rat gehört, und streams verwendet. Ich habe aber eine Frage (ich hoffe die letzte zum Thema
). Wie kann ich z.B. das dritte Wort der zweiten Zeile lesen und schreiben.
z.B.:out << string1 << ' ' << double1 << ' ' << string2; out << string3 << ' ' << double2 << ' ' << string4;
Ich möchte jetzt einem wxString Mystring den Inhalt von string4 zuweisen.
Gibt es da einen befehl wie:in >> endl; // => geht in zweite zeile; in >> temp1 >> temp2 >> Mystring; //
Und beim schreiben dann:
out << endl; out << temp1 << temp2 << wxT("Ganzwasneues");
-
Ein Stream besteht nicht aus Zeilen. Sondern ist nur ein unformatierter Eingabestrom.
In deinem Fall könntest du den Stream mit std::getline auslesen, und dann die 4. Zeile auswerten.