remove_copy
-
Hallo,
hab mal wieder eine Frage, und zwar will ich aus einem Text die Leerzeichen entfernen, und die Einzelzeilen als String einen Vektor speichern. Hab dazu auch schon in der Suche was gefunden, aber es hakt trotzdem. Wenn der Code wie unten aussieht, funktioniert die remove_copy-Funktion:
while(!file.eof()) { getline(file, line); // Zeilenweise einlesen string b; remove_copy (line.begin(), line.end(), back_inserter(b), ' '); cout<<b<<endl; stringvektor.push_back(b); z++; // Zählt Anzahl der Zeilen mit }Mich macht nur stutzig, ob da alles mit rechten Dingen zugeht, dass wenn ich den string b außerhalb der Klammer definiere (entweder string b; oder std::string b; ) kommt ein wirres Textzeug heraus. So funktionierts nicht:
std::string b; while(!file.eof()) { getline(file, line); // Zeilenweise einlesen remove_copy (line.begin(), line.end(), back_inserter(b), ' '); cout<<b<<endl; stringvektor.push_back(b); z++; // Zählt Anzahl der Zeilen mit }Wäre nett wenn mir jemand helfen würde, ist eventuell meine remove_copy-Funktion falsch?
-
Warum nimmst du nicht
std::remove()?
-
Da dachte ich ist das Problem, dass er mir die aktuelle Zeile nochmal überschreibt (eben soweit nach links schiebt bis alle Leerzeichen weg sind), und dann kann es passieren dass am Ende der Zeile "alte" Zeichen auftauchen, die nicht überschrieben wurden.
Aber es muss doch mit remove_copy auch gehen?
-
Was heisst wirres Textzeug?
Dass das nicht das macht, was du willst ist klar, weil b nie gelöscht wird und daher mit jeder Zeile länger wird.
Daher funktioniert nur die erste Version und ich schliesse mich Nexus an.
-
MikeBb schrieb:
Da dachte ich ist das Problem, dass er mir die aktuelle Zeile nochmal überschreibt (eben soweit nach links schiebt bis alle Leerzeichen weg sind), und dann kann es passieren dass am Ende der Zeile "alte" Zeichen auftauchen, die nicht überschrieben wurden.
Dafür gibt std::remove einen Iterator auf das erste "alte" Zeichen (sprich: das Ende des Ergebnisbereichs) zurück, den Du zusammen mit dem Ende-Iterator an die Methode std::string::erase(Iter, Iter) übergeben kannst, um den Rest zu entfernen.
-
Also irgendwie kapier ichs nicht, jetzt hab ichs abgeändert. Jetzt kommen zwar meine Zeilen schön nacheinander aber auch nur manchmal links angeordnet (der einzulesende Text hat viele Leerzeichen in jeder Zeile bis der Text anfängt). Stimmt wahrscheinlich wieder was nicht...
while(!file.eof()) { getline(file, line); // Zeilenweise einlesen remove (line.begin(), line.end(), ' '); cout<<line<<endl; stringvec.push_back(line); // push_back: Zeilen werden hintereinander hinzugefuegt z++; // Zählt Anzahl der Zeilen mit }Und das mit dem erase wegen der alten Zeichen krieg ich auch nicht hin.
Pleas help me!
-
Hat irgendjemand ne Idee wie ich des hinkrieg? Ich brauch echt Hilfe...
-
Habs doch hinbekommen.
string::size_type pos = 0; bool spacesLeft = true; while( spacesLeft ) { pos = line.find(" "); if( pos != string::npos ) {line.erase( pos, 1 );} else {spacesLeft = false;} } cout<<line<<endl;
-
Mit dem Tip "zusammen mit dem Ende-Iterator an die Methode std::string::erase(Iter, Iter) übergeben kannst", würde das ungefähr so aussehen:
while(!file.eof()) { getline(file, line); string::iterator it = remove (line.begin(), line.end(), ' '); line.erase(it, content.end()); stringvec.push_back(line); }