Datei als String einlesen, bearbeiten - falsche ausgabe?
-
Hallo,
ich finde meinen Fehler nicht, und ich verstehe auch ehrlich gesagt nicht wie die Ausgabe zustande kommt.Hier ist die Aufgabe:
1. Lese die Datei "haseundigel.txt" in einen String einlesen
2. Entferne alle Zeichen außer Buchstaben, Leerzeichen und EOL (=End Of Line ='\n') sind, aus dem
String
3. Soeicher die neue Datei als "hi,txt" ab.Mein Code ist folgender:
string zeileBearbeiten(const string & zeile) { string neu = zeile; for(int i = 1; i< zeile.size(); i++) { if(zeile[i] < 64 || (zeile[i] > 90 && zeile[i] < 97)) { neu.erase(i-1,0); } } return neu; } int main() { string Dateinamein = "haseundigel.txt"; string Dateinameout = "hi.txt"; string LineIn, LineOut; ifstream fileIn; ofstream fileOut; fileIn.open(Dateinamein.c_str()); fileOut.open(Dateinameout.c_str()); while(getline(fileIn, LineIn)) { LineOut = zeileBearbeiten(LineIn); cout << LineOut << endl; fileOut << LineOut << endl; } return 0; }Auszug aus der Ursprungsdatei:
Hase und Igel Diese Geschichte ist eigentlich gelogen, Kinder, aber wahr ist sie doch, denn mein Großvater, von dem ich sie habe, pflegte immer, wenn er sie erzälte, zu sagen: 'Wahr muss sie sein, mein Sohn, sonst koeennte man sie ja nicht erzählen. Die Geschichte aber hat sich so zugetragen. Es war an einem Sonntagmorgen im Herbst, gerade als der Buchweizen blühte; die Sonne war am Himmel aufgegangen, und der Wind strich warm über die Stoppeln, die Lerchen sangen hoch in der Luft, und die Bienen summten im Buchweizen. Die Leute gingen in ihrem Sonntagsstaat zur Kirche, und alle Geschoeepfe waren vergnügt, auch der Igel. Er stand vor seiner Tür, hatte die Arme verschränkt, er guckte in den Morgenwind hinaus und trällerte ein kleines Liedchen vor sich hin, so gut und so schlecht wie am Sonntagmorgen ein Igel eben zu singen pflegt. Während er nun so vor sich hinsang, fiel ihm ploeetzlich ein, er koeennte doch, während seine Frau die Kinder wusch und ankleidete, ein bißchen im Feld spazierengehen und nachsehen, wie die Steckrüben standen. Die Steckrüben waren ganz nah bei seinem Haus, und er pflegte sie mit seiner Familie zu essen, darum sah er sie auch als die seinigen an.Die Ausgabe ist jedoch folgende: (Er macht eigentlich nur Absätze rein, mehr nicht..)
Hase und Igel Diese Geschichte ist eigentlich gelogen, Kinder, aber wahr ist sie doch, denn mein Großvater, von dem ich sie habe, pflegte immer, wenn er sie erzälte, zu sagen: 'Wahr muss sie sein, mein Sohn, sonst koeennte man sie ja nicht erzählen. Die Geschichte aber hat sich so zugetragen. Es war an einem Sonntagmorgen im Herbst, gerade als der Buchweizen blühte; die Sonne war am Himmel aufgegangen, und der Wind strich warm über die Stoppeln, die Lerchen sangen hoch in der Luft, und die Bienen summten im Buchweizen. Die Leute gingen in ihrem Sonntagsstaat zur Kirche, und alle Geschoeepfe waren vergnügt, auch der Igel. Er stand vor seiner Tür, hatte die Arme verschränkt, er guckte in den Morgenwind hinaus und trällerte ein kleines Liedchen vor sich hin, so gut und so schlecht wie am Sonntagmorgen ein Igel eben zu singen pflegt. Während er nun so vor sich hinsang, fiel ihm ploeetzlich ein, er koeennte doch, während seine Frau die Kinder wusch und ankleidete, ein bißchen im Feld spazierengehen und nachsehen, wie die Steckrüben standen. Die Steckrüben waren ganz nah bei seinem Haus, und er pflegte sie mit seiner Familie zu essen, darum sah er sie auch als die seinigen an.kann mir jemand helfen?
-
ich verstehe einfach nicht, woran es liegt, dass er die Kommas etc. nicht entfernt

-
Wofür dient der zweite Paramter bei erase (Zeile 8)?
-
Meines Erachtens, gibt das an wieviel Zeichen gelöscht werden sollen. Der erste gibt den index an, der zweite wieviel gelöscht werden soll. Das ist möglicherweise der Fehler, denn wenn da 0 steht, dann löscht er ja auch keine Zeichen - richtig?
Habs aber gleichmal ausprobiert. Wenn ich ne 1 reinschreibe bekomme ich eine Fehlermeldung:
Unbehandelte Ausnahme bei 0x7716c42d in Hase und Igel.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0044fc94..--> Diese Fehlermeldung hatte ich eigentlich immernur bei Index fehlern.
und die Ausgabe lautet: (das und mehr nicht)
Has undIgel
-
Mit dem Debugger kannst du heraus finden in welcher Zeile dein Programm abschmiert. Ich denke mal, dass du über das Ende des Strings hinaus löscht (da er ja am Ende der Zeile abschmiert).
-
Noch ein Hinweis.
Deine Schleife läuft bis zeile.size() du verwendest den Index aber in 'neu' welches bei jedem Löschvorgang kürzer wird.
-
Leerzeichen und EOL (=End Of Line ='\n')
EOL ist auch ein Leerzeichen.
ifstream fileIn; ofstream fileOut; fileIn.open(Dateinamein.c_str()); fileOut.open(Dateinameout.c_str());- Filestreams mit einem Konstruktor initialisieren. Nicht mit
open(). - Die Konvertierung zu einem C-String ist auch überflüssig, seit C++11.
ifstream fileIn(Dateinamein); ofstream fileOut(Dateinameout);Deine Bearbeitungsfunktion ist extrem ineffizient, weil sie jeden Buchstaben einzeln löscht - aber auch weil du alles pufferst, was eigentlich überflüssig ist.
Stattdessen reicht ein einziger Aufruf einer STL-Funktion (!):
ifstream fileIn(Dateinamein); ofstream fileOut(Dateinameout); std::copy_if( std::istreambuf_iterator<char>(fileIn), {}, std::ostreambuf_iterator<char>(fileOut), []( char c ) { return std::isspace(c) || std::isalpha(c); } );Er kopiert die Zeichen von
fileInnachfileOutdie entweder ein Whitespace oder ein Buchstabe sind.
- Filestreams mit einem Konstruktor initialisieren. Nicht mit
-
Rachmaninow schrieb:
--> Diese Fehlermeldung hatte ich eigentlich immernur bei Index fehlern.
und die Ausgabe lautet: (das und mehr nicht)
Has undIgelDas mag darin liegen, dass du auch einen Indexfehler machst.
0. Du fängst beim Index 1 an.
1. Du löscht nicht das Leerzeichen, sondern das Zeichen davor. (Darum ist das e bei Hase weg)
2. Das Zeichen ist gelöscht, du passt aber deinen Index nicht an. (Der string ist jetzt ja kürzer)
3. Du testet in Zeile, änderst aber in neu.Zudem ist die Aufgabe nicht richtig gelöst:
1. Lese die Datei "haseundigel.txt" in einen String einlesen
Wieviel von der Datei liest du in einen string ?
-
Arcoth schrieb:
EOL ist auch ein Leerzeichen.
I.A wird aber bei Leerzeichen von dem Leerzeichen ' ' gesprochen.
EOL und Leerzeichen sind Leerraum.
Es sind aber totzdem unterschiedliche Zeichen.
-
I.A wird aber bei Leerzeichen von dem Leerzeichen ' ' gesprochen.
Stimmt, aber wir sind in einem Programmierforum, wo das Wörtlein "Leerraum" nicht verwendet wird, stattdessen Whitespace. Und ich nahm an, dass er Whitespaces behalten will - ich habe immer gedacht, Leerzeichen = Whitespace, aber das ist wohl nicht der Fall.
Dann kann das Prädikat trivial angepasst werden - ich glaube aber nicht dass das nötig ist.
-
Das Leerzeichen ist Space. Und klar, das gehört zu den Whitespace.
Ich hatte Leerraum auch nur genannt, damit du siehst, dass es für Whitespace eine (andere) deutsche Bezeichnung gibt.
Deine Annahme wird auch richtig sein, nur die Begründung war unglücklich.
(Und sie hätte evtl. auch Rachmaninow das falsche denken lassen).