Meine C++-Fragen (Anfänger)
-
Guten Tag!
Ich habe ein mehr oder weniger kleines Problem.#include <string> #include <iostream> #include <fstream> #include <sstream> using namespace std; void wroten(std::string ersatz); bool stopit; std::string Ersetzer(const std::string &Suchstring, const std::string &stringErsetzer, std::string ZuErsetzendesGebilde) { std::string::size_type pos = ZuErsetzendesGebilde.find(Suchstring, 0); int intLengthSearch = Suchstring.length(); while(std::string::npos != pos) { ZuErsetzendesGebilde.replace(pos, intLengthSearch, stringErsetzer); pos = ZuErsetzendesGebilde.find(Suchstring, pos + intLengthSearch); wroten(ZuErsetzendesGebilde); }; return ZuErsetzendesGebilde; }; fstream write_file; void wroten(string ersatz) { if (!stopit) { write_file.open("Auflistung.txt"); write_file << ersatz << endl; write_file.close(); stopit; }; }; void ersetzen (ifstream file, string quelle , string Suchobjekt, string Ersetzung) { ; while (!file.eof()) { getline(file,quelle); if (quelle==Suchobjekt) { //Suchobjekt->Ersetzung }; }; }; void find_and_replace( string &source, string find, string replace ) { size_t j; for ( ; (j = source.find( find )) != string::npos ; ) { source.replace( j, find.length(), replace ); }; }; int main() { string search = "\\NPC\\"; string replace = "\\NPC\\NPC_RuestungsFunctions.txt\n"; ifstream read_file("Auflistung.txt"); string linebuffer; while (!stopit) { zaehler++; getline(read_file,linebuffer); cout << linebuffer << endl; Ersetzer(search,replace,linebuffer); //Ersetzer("\r\n","",stringToReplace); }; cout << endl; read_file.close(); };
Wenn man den Code verwendet, dann funktioniert er zwar - jedoch fehlerhaft.
Normalerweise sollte er in dieser Datei hierAI\ORC\ZS_ORC_TA.txt
AI\ORC\Grunzer_*.txt
AI\ORC\Arten_ORC.txt
AI\ORC\TESTORC.txt
AI\ORC\TESTORCSLAVE.txtSTORY\NPC\BAU*.txt
STORY\NPC\BORG*.txt
STORY\NPC\CS*.txtBesser gesagt die erste darin enthaltene Zeile, inder \NPC\ vorkommt, durch diese hier ersetzen:
STORY\NPC\NPC_RuestungsFunctions.txt
Allerdings kommt dies hier dabei heraus:
STORY\NPC\NPC_RuestungsFunctions.txt
CS*.txtC\Arten_ORC.txt
AI\ORC\TESTORC.txt
AI\ORC\TESTORCSLAVE.txtSTORY\NPC\BAU*.txt
STORY\NPC\BORG*.txt
STORY\NPC\CS*.txtWie man sehen kann ist das, alsob man versucht mit aktiver "Einfügetaste" einen Geldbetrag in einer Datei zu ändern: Katastrophal!
Nun weiß ich langsam nicht mehr weiter.
Kennt von euch jemand die Lösung meines Problemes?Nochmal zur Erläuterung:
Das Programm soll nur eine Zeile tatsächlich austauschen und den Rest lassen, wie er ist.mfg for (I=I'm; i>0; i++)
-
Dein Programm ist insgesamt recht wüst.
z.B.
- Einrückung
- Nach Funktionen, for-Schleifen etc. gehört kein Semikolon
- was ist stopit? "stopit;" bewirkt überhaupt nichts
- Variablendeklaration mal eben irgendwo dazwischen
- Funktionen ersetzen() und find_and_replace() werden gar nicht aufgerufen (geposteten Code bitte aufs wesentliche beschränken)
- "zaehler" gibt's noch nicht malZu deinem Problem:
Du öffnest in der Funktion wroten() deine Datei ein zweites mal, d.h. der Filepointer steht am Anfang der Datei, deshalb wird dein Ersatzstring auch dahin geschrieben.
Mach eine komplett neue Datei auf, in die du falls in einer Zeile nichts zu ersetzen ist, den Originaltext schreibst, ansonsten den geänderten Text. Zum Schluss alte Datei löschen und neue umbenennen nach "Auflistung.txt"
-
hüstel schrieb:
- Variablendeklaration mal eben irgendwo dazwischen
Hm, ich dachte bisher Variablendeklarationen sollte man erst dann machen, wenn man die Variable braucht. Stimmt das oder ist das schlechter Stil?
Gruss
Cartman
-
Eric Cartman schrieb:
hüstel schrieb:
- Variablendeklaration mal eben irgendwo dazwischen
Hm, ich dachte bisher Variablendeklarationen sollte man erst dann machen, wenn man die Variable braucht. Stimmt das oder ist das schlechter Stil?
Gruss
Cartmanstimmt ^^
-
fstream write_file; void wroten(string ersatz) { if (!stopit) { write_file.open("Auflistung.txt"); write_file << ersatz << endl; write_file.close(); stopit; }; };
Du brauchst write_file aber nicht da sondern da:
void wroten(string ersatz) { fstream write_file; if (!stopit) { write_file.open("Auflistung.txt"); write_file << ersatz << endl; write_file.close(); stopit; } }