Problem mit replace
-
Hi, ich hab folgenden Code um eine Datei einzulesen, und diese dann bearbeitet in neuer Datei zu speichern
#include <iostream> #include <string> #include <fstream> using namespace std; void DateiLaden() { ifstream altes_file; string zeile; ofstream neues_file; string neue_zeile; neues_file.open("Neu.txt",ios::app); size_t key; string re("+"); altes_file.open("bla.txt"); if(altes_file.is_open()) { while(!altes_file.eof()) { getline(altes_file,zeile); neue_zeile = zeile; key = zeile.find("|"); neue_zeile.replace(key,2,re); // <- kritische zeile cout << neue_zeile <<endl; } neues_file.close(); altes_file.close(); } else cout << "Fehler" <<endl; } int main() { ofstream neues_file; neues_file.open("Neu.txt"); DateiLaden(); return 0; }Wenn ich die "kritische Zeile" rauslasse, funktioniert das alles, aber wenn die Zeile eben drin ist, dann bekomme ich beim ausführen vom Programm diese Fehlermeldung :
This application has requested the Runtime to terminate...Weiss jemand woran das liegt ?
-
Ich glaube du musst sicherstellen das key nicht zeile.end() ist. Also kein | wurde gefunden
//Edit: Nicht end(), sondern string::npos
http://www.cppreference.com/cppstring/find.html
// ... if(key != string::npos) neue_zeile.replace(key,2,re); // <- kritische zeile //...
-
Dass das Programm abstürzt, liegt daran, dass das Zeichen "|" gar nicht in der Datei vorhanden ist. Deshalb bietet sich generell bei solchen Dingen immer eine Prüfung an, die besagt, ob das Zeichen gefunden wurde oder nicht:
if(key = zeile.find("|") == string::npos) break; neue_zeile.replace(key,2,re); // <- Sie's guuute Zeile! :)Edit: Wurde ja schon gesagt....
-
aber das "|" zeichen existiert sehr wohl.
Jetzt bringt er zwar keinen Fehler mehr, aber er macht auch nichts mehr.Edit : keine Ahnung warum, aber so gehts jetzt :
key = neue_zeile.find(re); if(key != string::npos) { neue_zeile.replace(neue_zeile.find(re),re.length(),"+"); }danke trotzdem für eure Hilfe, immerhin habt ihr mich auf den richtigen Dampfer gebracht
-
toxor schrieb:
Jetzt bringt er zwar keinen Fehler mehr, aber er macht auch nichts mehr.
Das wäre jetzt aber eine andere Seite des Blattes, Dein Kernproblem wurde ja schon behoben.
Ich kann Dir schlecht weiterhelfen, wenn ich nicht weiß, was Du überhaupt machen möchtest. Ich gehe mal davon aus, dass Du alle "|" in der Datei mit "+" ersetzen möchtest.
Da wäre folgende Lösung besser, da Du mit Deiner Lösung jeweils nur das erste gefundene "|" ersetzt, alle nachfolgenden Zeichen in der Zeile werden nicht ersetzt:
std::string line("kkll||"); std::size_t prev_char(0); for(std::size_t i(0); i<line.length(); ++i) { prev_char = line.find("|", prev_char); if(prev_char != std::string::npos) line.replace(prev_char, 1, "+"); }Und um Dir die Denkarbeit zur späten Stund zu ersparen, bin ich mal so frei, und habe es Dir gleich in die Schleife gesetzt:
while(!altes_file.eof()) { getline(altes_file,zeile); neue_zeile = zeile; size_t prev_char(0); for(size_t i(0); i<neue_zeile.length(); ++i) { prev_char = neue_zeile.find("|", prev_char); if(prev_char != string::npos) neue_zeile.replace(prev_char, 1, "+"); } cout << neue_zeile <<endl; }Wobei Dir hoffentlich klar ist, dass der Datei-Stream neues_file unbenutzt ist, und von daher auch nichts zu erwarten ist.
