Schleife mit fstream klappt nicht
-
Guten Tag.
Ich habe eine Schleife gebastelt, die eine Datei Zeile für Zeile durchgeht.
Wenn sie einen bestimmten Text findet, soll sie den "löschen".
Aber leider geht es nicht.Es wird mir auch kein Fehler vom Compiler angezeigt.
Bis zum ersten gefundenen Wort klappt das, danach hört die Schleife auf.
Und das gefundene Wort hat sie auch nicht ersetzt.Hier mein Code:
void MarkierungEntfernen(CString sParameter2) { fstream f2; f2.open(sParameter2, ios::in); string sAuslesen; while (! f2.eof()) { getline(f2, sAuslesen); string::size_type sMarkierungGefunden = sAuslesen.find( "***+DEFAULT+***", 0); if(sMarkierungGefunden != string::npos) { cout << sAuslesen.substr(15); f2 <<sAuslesen.substr(15)<<endl; } } f2.close(); }
-
Du öffnest den Stream mit ios::in, schreibst dann aber später im if-Block was hinein. Das kann nicht gut gehen.
-
pumuckl schrieb:
Du öffnest den Stream mit ios::in, schreibst dann aber später im if-Block was hinein. Das kann nicht gut gehen.
Wenn ich den Konstanten ios:out nehme, gehts auch nicht.
Dann ist die komplette Datei leer.Er schreibt ja meinen Wert noch ncihtmal neu rein.
-
Wenn du wiederum nur ios::out nimmst, klappt das Lesen nicht mehr...
-
SeppJ schrieb:
Wenn du wiederum nur ios::out nimmst, klappt das Lesen nicht mehr...
Gibt es kein "Lesen und Editieren?"
Will ja nur eine Textstelle umändern?!
-
Claudiah schrieb:
Gibt es kein "Lesen und Editieren?"
Will ja nur eine Textstelle umändern?!Indem du den Stream ganz einfach mit ios::in UND ios::out öffnest. Was eh die defaultwerte sind, weshalb du den openmode auch gleich weglassen kannst.
-
pumuckl schrieb:
Claudiah schrieb:
Gibt es kein "Lesen und Editieren?"
Will ja nur eine Textstelle umändern?!Indem du den Stream ganz einfach mit ios::in UND ios::out öffnest. Was eh die defaultwerte sind, weshalb du den openmode auch gleich weglassen kannst.
Stimmt.
Also wenn ichfstream f2; f2.open(sParameter2); while (! f2.eof()) { getline(f2, sAuslesen); cout << sAuslesen <<endl; } f2.close();mache, zeigt er mir schön Zeile für Zeile an.
Wenn ich aber an der Datei was verändern möchte:fstream f2; f2.open(sParameter2); while (! f2.eof()) { getline(f2, sAuslesen); cout << sAuslesen <<endl; f2 << "haha in jeder Zeile"<<endl; }hört er nach der erstenn Zeile auf.
Ich will das er Zeile für Zeile einliest und editiert.
f2.close();
-
Öffne deine Datei lesend und erstelle eine zweite Datei zum Schreiben. Jede Zeile, die du nicht löschen möchtest, schreibst du in die zweite Datei.
-
sdfk.b schrieb:
Öffne deine Datei lesend und erstelle eine zweite Datei zum Schreiben. Jede Zeile, die du nicht löschen möchtest, schreibst du in die zweite Datei.
ja ne noch eine datei wollte ich ungern anlegen.
es muss doch irgendwie möglich sein, eine Datei zu bearbeiten ohne sie komplett zu leeren?!
-
Hallo,
du kannst ja auch erst die ganze Datei einlesen und dann in diese wieder ausgeben:
ifstream in(sParameter2); std::vecotor<std::string> sAuslesen; std::string buff; while (! in.eof()){ getline(in, buff); if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); //oä. Abfragen } in.close(); ofstream out(sParameter2); for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; out.close();Gruß Simon
-
du kannst ja auch erst die ganze Datei einlesen und dann in diese wieder ausgeben:
Ich möchte aber auch Teile der Datei verändern
-
Du kannst ja die Strings verändern bevor du sie wieder ausgibst ...
-
varginator schrieb:
Du kannst ja die Strings verändern bevor du sie wieder ausgibst ...
Danke!
Aber irgendwie verstehe ich dein geposteten Code nicht ganz. Könntest du mir ihn bitte erklären.
Also ich möchte das er alles übernimmt so wie es in der Datei schon steht, außer wenn er dieses +Default+ findet, soll er das löschen.
-
Der Code macht folgendes:
Er liest aus der Datei alles ein und speichert die Zeilen, die du zulässt, in einem std::vector. Dann speichert er den Vector wieder zurück in die Datei.
-
ifstream in(sParameter2); std::vecotor<std::string> sAuslesen; std::string buff; while (! in.eof()){ getline(in, buff); if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); //oä. Abfragen } in.close(); ofstream out(sParameter2); for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; out.close();Also als erstes liest er das Zeile für Zeile ein.
Und wenn er +Default+ gefunden hat, geht in ins IF
Richtig?
Und dann?
Was ist dieses pushBack?
Wo und wie sag ich ihm nun, dass er +DEFAULT+ löschen soll?
-
OK, hier mal die Erklärung:
ifstream in(sParameter2); //sollte klar sein -> öffnen zum lesen std::vector<std::string> sAuslesen; //anlegen eines String-Vectors std::string buff; //puffer, um zeile zu lesen while (getline(in, buff)) //braucht ma nichmal eof, sondern fragt einfach auf gültigkeit if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); //oä. Abfragen // ^ Abfrage ob der string in buff vorhanden ist ^ wenn nicht -> zeile an den Vector hängen in.close(); //Datei schließen ofstream out(sParameter2); //öffnen -> schreiben for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; //schreiben -> alles aus dem vector out.close(); //schließen
-
Er schaut, ob der text "***+DEFAULT+***" in der gelesenen Zeile ist, wenn nicht, dann hängt er die Zeile an den Vector (Array der stl) an
Dann gibt er die Zeilen wieder in die Datei aus ...
-
varginator schrieb:
OK, hier mal die Erklärung:
ifstream in(sParameter2); //sollte klar sein -> öffnen zum lesen std::vector<std::string> sAuslesen; //anlegen eines String-Vectors std::string buff; //puffer, um zeile zu lesen while (getline(in, buff)) //braucht ma nichmal eof, sondern fragt einfach auf gültigkeit if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); //oä. Abfragen // ^ Abfrage ob der string in buff vorhanden ist ^ wenn nicht -> zeile an den Vector hängen in.close(); //Datei schließen ofstream out(sParameter2); //öffnen -> schreiben for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; //schreiben -> alles aus dem vector out.close(); //schließenHey DANKE!

Nun ist es mir klar.Muss ich für vector irgendeine bestimmte headerdatei includen? Weil mein Compiler meckert irgendwie^^
Und ich möchte das er "***+DEFAULT+***" nicht mitspeichert aber alles andere in der Zeile.
Also wenn da nun steht:
***+DEFAULT+***NAME=PeterSoll er NAME=Peter schon mit in den Vecotr nehmen. Alles bis auf +DEFAULT+
-
Ja, du benötigst
#include <vector>und den Text rausschneiden:
string text = "***+DEFAULT+***"; int pos = buff.find(text); if(pos != buff.npos) buff.erase(pos, text.length()); sAuslesen.push_back(buff);
-
varginator schrieb:
Ja, du benötigst
#include <vector>und den Text rausschneiden:
string text = "***+DEFAULT+***"; int pos = buff.find(text); if(pos != buff.npos) buff.erase(pos, text.length()); sAuslesen.push_back(buff);Dein Support ist super, danke!
Aber habs noch nicht richtig hinbekommen.
Schneidet den Text immer noch nicht raus:ifstream in(sParameter2); // öffnen zum lesen std::vector<std::string> sAuslesen; //anlegen eines String-Vectors std::string buff; //puffer, um zeile zu lesen string text = "***+DEFAULT+***"; size_t pos = buff.find(text); while (getline(in, buff)) //braucht ma nichmal eof, sondern fragt einfach auf gültigkeit if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); //oä. Abfragen // ^ Abfrage ob der string in buff vorhanden ist ^ wenn nicht -> zeile an den Vector hängen if(pos != buff.npos) buff.erase(pos, text.length()); sAuslesen.push_back(buff); in.close(); //Datei schließen ofstream out(sParameter2); //öffnen -> schreiben for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; //schreiben -> alles aus dem vector out.close(); //schließen