strings mit Leerzeichen
-
@Freak_Coder
Das Speichern und Laden funktioniert ja jetzt, nur halt noch das Problem
mit den Leerzeichen.
getline() wird wohl das Zauberwort sein.
-
Ich hab versucht, den getline() mit dem Operator >> zu mischen.
Das scheint nicht zu gehen.getline(ProjectFile,tempMusicFile); ProjectFile>>tempMusicInpoint>>tempMusicOutpoint>>tempGap; tempMusicGap=static_cast<Gap>(tempGap);Wenn ich alles mit getline() auslese, dann hab ich das Problem, dass ich
strings in uints umwandeln muss, was mit static_cast nicht funktioniert.
Im File ist jeweils nur der erste Eintrag ein string, der Leerzeichen
enthalten kann. Alle weiteren sind uints.
-
Das Problem liess sich mit atoi() lösen.
-
Nur als Hinweis den Link zum FAQ Thema einmal Zahl nach String und zurück
-
getline(ProjectFile,tempBombId); getline(ProjectFile,temp1); getline(ProjectFile,temp2); getline(ProjectFile,temp3); tempBombLaunchTime=atoi(temp1.c_str()); tempBombLaunchGroup=atoi(temp2.c_str()); tempBombLaunchSlot=atoi(temp3.c_str());So konnte ich meine Datei auslesen.
Nur beim Schreiben hab ich Probleme.
Mit ultoa() wollte ich meine uints in strings umwandeln.ultoa(MusicIter->getMusicInpoint(),temp1,10); ultoa(MusicIter->getMusicOutpoint(),temp2,10); ultoa(static_cast<unsigned int>(MusicIter->getMusicGap()),temp3(),10); getline(temp1.,ProjectFile); getline(temp2,ProjectFile); getline(temp3,ProjectFile);Doch das funktioniert nicht.
-
Also nochmal von vorne...
Erstmal speicherst du deine Daten so ab:
for(BombIter=BombList->begin();BombIter!=BombList->end();++BombIter) { ProjectFile <<BombIter->getBombId() << " " <<BombIter->getBombLaunchTime() <<" " <<BombIter->getBombLaunchGroup() <<" " <<" " <<BombIter->getBombLaunchSlot() <<endl; }Dann sieht deine Datei so aus:
<String> <uint> <uint> <uint> <String> <uint> <uint> <uint> <String> <uint> <uint> <uint>Jetzt sollte auch klar sein, wieso du getline() und op>> nicht mischen solltest, da du ja eine Zeile einliest und die uints "weg" sind und op>> aufm String dann ist...
Wie auch im anderen Thread geschrieben musst deine Lade Funktion so aussehen:
while(!ProjectFile.eof() && !ProjectFile.fail()) { int size; ProjectFile >> size; for(int i=0;i<size && !ProjectFile.fail();++i) { if((ProjectFile>>tempBombId) && (ProjectFile>>tempBombLaunchTime) && (ProjectFile >>tempBombLaunchGroup) && (ProjectFile>>tempBombLaunchSlot)) edit(...); } } // Prüfen ob alles ohne Fehler gelesen wurdeDa benutzt du nur op>> und es sollten dann keine Schwirigkeiten kommen, wenn du das Speichern wie oben benutzt.
-
Und immer:
mase schrieb:
Doch das funktioniert nicht.
hilft uns auch nicht weiter, du musst schon ne genau Fehlerbeschreibung liefern.
Aber das ist ja jetzt egal (siehe Post oben)
-
Ich speichere immer noch ein newline zwischen den Variablen, so dass meine
Datei so aussieht:string uint uint uintDann müsste ich doch nur den String mit getline() auslesen, den rest mit >>.
Aber ich kann auch alles mit getline() auslesen, wenn ich es könnte
-
Das Speichern geht mit >>, ich hatte einen Fehler im Hauptprogramm, und
dachte, es liegt an den Leerzeichen im String.
Jetzt geht alles wunderbar!
Ist die Umwandlung von uint nach string mit atoi() ok, oder sollte ich das
anders machen, z. B. sprintf?
Eine Typenprüfung brauch ich an dieser Stelle ja nicht, da die Zahl ja
schon aus einer uint-Variable kommt.
-
Wenn du es so rausschreibst, brauchst du zum Einlesen der uints kein getline (nur für den string) und somit auch keine Konvertierung. Lies einfach direk ein.
-
Du meinst, ich soll getline für die Strings und den Ein- Ausgabeoperator für
die uints mischen?
Aber es funktioniert ja jetzt so.
-
mase schrieb:
Du meinst, ich soll getline für die Strings und den Ein- Ausgabeoperator für
die uints mischen?
Aber es funktioniert ja jetzt so.Wenns dir gefällt unnötges kompliziert zu machen und du denkst Umwandlungen sind effizient, kannst du es so lassen

-
Wenn getline und >> mischbar sind, dann hast du recht, die Konvertierung ist
dann unnötig. Ich probier das mal.
Ich wusste halt nur nicht, ob der Dateizeiger nach getline an der Stelle
bleibt.
-
Also getline und >> zu mischen hat soweit funktioniert.
Ich musste nur an den Stellen, wo auf ein >> ein getline folgt,
ein getline einbauen, dass mir das newline abfängt, sonst ist das
folgende getline ohne Daten, bzw. enthält nur ein newline.
Dazu habe ich die bereits vorhandene Variable tempMusicFile verwendet, die
in den entsprechenden Momenten nicht benötigt wird.
Diese Art ist vielleicht etwas unschön, aber ich komme ohne die
Konvertierungen von string nach uint aus.//Read projectname from file getline(ProjectFile,ProjectName); //Read musiclist from file MusicList->clear(); ProjectFile>>size; //Overread newline getline(ProjectFile,tempMusicFile); for(unsigned int i=0;i!=size;i++) { getline(ProjectFile,tempMusicFile); ProjectFile>>tempMusicInpoint>>tempMusicOutpoint>>tempMusicGap; addMusic(tempMusicFile,tempMusicInpoint,tempMusicOutpoint,static_cast<Gap>(tempMusicGap),i+1); //Overread newline getline(ProjectFile,tempMusicFile); }
-
mase schrieb:
Also getline und >> zu mischen hat soweit funktioniert.
Ich musste nur an den Stellen, wo auf ein >> ein getline folgt,
ein getline einbauen, dass mir das newline abfängt, sonst ist das
folgende getline ohne Daten, bzw. enthält nur ein newline.Klar, getline() liest bis zum nächsten \n, op>> lässt alles hinter der Eingabe im Speicher stehen. Alternativ könntest du auch über ignore() den Rest der Zeile komponstieren (oder über "ProjectFile>>ws;" alle Whitespaces (einschließlich \n und möglicherweise dem Anfang der folgenden Zeile) überspringen).