Schleife mit fstream klappt nicht
-
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
-
Der "gekürzte Text" sollte am Ende der Datei hängen, glaub ich. Hab den Code nur grob überflogen.
-
Das kleine addon gehört in die while schleife mit rein. Nicht dahinter.
-
It0101 schrieb:
Der "gekürzte Text" sollte am Ende der Datei hängen, glaub ich. Hab den Code nur grob überflogen.
hä wie?
-
Wo jetzt genau?
Irgendwie blicke ich da eh nciht durch.Schreibt man if und while nicht so?
while () { ......//hier der code } if () { ......//hier der code }Da wird irgendwie ne ganz andere Synthax benutzt.
-
habs nun so geschreiben ( geht aber immer noch nicht
)ifstream in(sParameter2); std::vector<std::string> sAuslesen; / std::string buff; string text = "***+DEFAULT+***"; size_t pos = buff.find(text); while (getline(in, buff)) { if(buff.find("***+DEFAULT+***") != buff.npos) sAuslesen.push_back(buff); if(pos != buff.npos) buff.erase(pos, text.length()); sAuslesen.push_back(buff); } in.close(); ofstream out(sParameter2); for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; //schreiben -> alles aus dem vector out.close();
-
#include <iostream> #include <string> #include <fstream> #include <vector> using namespace std; int main() { string sParameter2 = "test.txt"; //-> zum Testen ifstream in(sParameter2.c_str()); // öffnen zum lesen if(!in.good()){ cout<<"Fehler, die Datei wurde nicht gefunden"<<endl; return 1; } std::vector<std::string> sAuslesen; //anlegen eines String-Vectors std::string buff; //puffer, um zeile zu lesen string text = "+default+"; while (getline(in, buff)){ int pos = buff.find(text); if(pos != buff.npos) buff.erase(pos, text.length()); sAuslesen.push_back(buff); } in.close(); //Datei schließen ofstream out(sParameter2.c_str()); //öffnen -> schreiben for(int i = 0; i < sAuslesen.size(); i++) out<<sAuslesen[i]<<endl; out.close(); //schließen return 0; }