Vokale entfernen
-
Schreiben ein Programm das alle Vokale aus einer Datei entfernen soll. Dabei habe ich zwei Probleme, erstens der Compiler sagt das bei line[i]=''; eine leere Zeichenkonstante ist, und zweitens wieso kann stringstream nicht aus line lesen.
cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; string name; cin>>name; ifstream istr(name.c_str(),ios_base::in); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; string line; getline(cin,line); for (int i = 0; i<line.size();++i) switch(line[i]){ case'E':case'e':case'A':case'a':case'i':case'I': line[i]= ''; // hier der Fehler } stringstream ss(line); // wieso ließt stringstream nicht aus line vector<string> vs; string word; while(ss>>word) vs.push_back(word); for (int i = 0;i<vs.size();++i) cout << vs[i] << endl; keep_window_open(); return 0;Die Textdatei:
Es war einmal!Die Ausgabe sollte das sein:
s wr nml!
-
Ohne deinen Code allzu sehr umzubasteln, so sollte es gehen:
line.erase(line.begin()+i);EDIT:
Ach ja, und mit dem stringstream... hm, probier doch mal so:stringstream ss; ss << line;
-
Leider ist im vector nichts. Als Ausgabe habe ich eine 0.
cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; string name; cin>>name; ifstream istr(name.c_str(),ios_base::in); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; string line; getline(cin,line); for (int i = 0; i<line.size();++i) switch(line[i]){ case'E':case'e':case'A':case'a':case'i':case'I': line.erase(line.begin()+i); } stringstream ss; ss << line; vector<string> vs; string word; while(ss>>word) vs.push_back(word); for (int i = 0;i<vs.size();++i) cout << vs[i] << endl; cout << vs.size() << endl; // zum testen ob was im vector drin ist keep_window_open(); return 0;
-
winux schrieb:
Leider geht es nicht.
"Geht nicht" ist keine vernünftige Fehlerbeschreibung. Was genau geht nicht?
-
Kein Wert im vector. Als Ausgabe bekomme ich eine 0.
EDIT: mit dieser Zeile habe ich 1 Wert im vector:
vs.push_back(line);
-
Du willst doch aus einer Datei alle Zeilen verarbeiten, richtig? Wieso gibst du beim getline dann cin an? Da müsste istr rein. Dann kriegst du schon mal die erste Zeile der Datei (wenn sie geöffnet werden konnte).
Btw, nutze den Debugger! Gehe Zeile für Zeile zur Laufzeit durch das Programm, dann findest du auch schneller (bzw. überhaupt) Fehler.
-
Du hast recht, da war der Fehler. Jetzt wird auch eingelesen, doch bei der Ausgabe gibt es noch einen kleinen Fehler, jedes Wort wird in einen eigene Zeile Ausgaben:
s wr nml!Aber ich will das es so Ausgeben wird:
s wr nml!
-
Dann mach eben kein endl nach der Ausgabe. Und stattdessen ein Leerzeichen.
Zum Stringstream: Das war am Anfang schon in Ordnung so, deinen eigentlichen Fehler kennst du ja nun.
-
winux schrieb:
Du hast recht, da war der Fehler. Jetzt wird auch eingelesen, doch bei der Ausgabe gibt es noch einen kleinen Fehler, jedes Wort wird in einen eigene Zeile Ausgaben:
s wr nml!Aber ich will das es so Ausgeben wird:
s wr nml!Also erstens dürfte das nicht ganz so funktionieren, wie du willst. Sobald einmal erase durchgeführt wird, rückt ja das folgende Zeichen um eins nach links, i wird um eins erhöht, und du überspringst ein Zeichen. Bei Sätzen mit 2 aufeinander folgenden Vokalen sollte es dir auffallen. Einer bleibt dann übrig. Mach es lieber in etwa so:
int i=line.find_first_of("aeiouAEIOU"); while(i!=std::string::npos) { line.erase(line.begin()+i); i=line.find_first_of("aeiouAEIOU"); }Und zum Zeilenumbruch: den hast du doch selbst da 'reinprogrammiert. Nimm ihn wieder raus! Kann es sein, dass du dir das Programm zusammenkopiert hast? Tipp: "endl" ist der Zeilenumbruch, den du nach jedem Wort ausgibst. Wenn du nach der Ausgabe nichts weiter mit den einzelnen Wörtern machen willst, kannst du dir auch den vector sparen. Einfach so ausgeben und den ganzen überflüssigen Quatsch 'rausnehmen:
cout << line << endl;
-
Danke für deine Hilfe und für den Tipp.