Schleife mit fstream klappt nicht
-
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; }
-
#include <iostream> #include <fstream> #include <vector> #include <string> int main() { std::string dateiname("test.txt"); std::ifstream fileIn(dateiname.c_str()); if(!fileIn) { // Falls Datei nicht geöffnet werden konnte, Fehler ausgeben und Programm beenden std::cerr << "Datei \"" << dateiname << "\" wurde nicht gefunden." << std::endl; return 1; } std::vector<std::string> neuerInhalt; for(std::string zeile, loeschString("***+DEFAULT+***"); std::getline(fileIn, zeile); ) { // Zeile für Zeile lesen std::string::size_type position = zeile.find(loeschString); // erstes Auftreten Suchen while(position != std::string::npos) { // Falls gefunden... zeile.erase(position, loeschString.size()); // entfernen und... position = zeile.find(loeschString, position + 1); // weitersuchen } neuerInhalt.push_back(zeile); // gelesene (und evtl. geänderte) Zeile hinzufügen } fileIn.close(); std::ofstream fileOut(dateiname.c_str()); for(std::vector<std::string>::const_iterator beg(neuerInhalt.begin()), end(neuerInhalt.end()); beg != end; ++beg) fileOut << *beg << "\n"; // Und alles wieder zurückschreiben return 0; }Inhalt der Datei:
Eine Testzeile Einmal mit ***+DEFAULT+***bitte ***+DEFAULT+***Am Anfang Und am Ende***+DEFAULT+*** Zweimal ***+DEFAULT+***in einer ***+DEFAULT+***Zeile Letzte TestzeileNach Ausführung des Programms:
Eine Testzeile Einmal mit bitte Am Anfang Und am Ende Zweimal in einer Zeile Letzte Testzeile
-
Ok, natürlich hab ich nicht das coole zweimal_in_einer_zeile feature, aber sonst geht meins auch ...
-
VIELEN DANK varginator !!!!
(und an allen auch Danke natürlich)
Funktioniert nun! Ihr seid super.Eine kleine Abschlussfrage:
if(!in.good()){ cout<<"Fehler, die Datei wurde nicht gefunden"<<endl; return 1; }muss das return da hin?
-
muss nicht, kann aber schon

-
naja, damit macht er halt nichmehr weiter, was auch sinnvoll ist, wenn er die Datei nich findet
Und ich hab mir gedacht "return 1;" weil's ja n Fehler is ....
Gruß Simon
-
varginator schrieb:
Ok, natürlich hab ich nicht das coole zweimal_in_einer_zeile feature, aber sonst geht meins auch ...
Ich habe nichts anderes behauptet. Eigentlich wollte ich ihm nur ein kompilierbares Copy & Paste Beispiel liefern, aber da warst du leider genau 6 Sekunden schneller als ich

-
Ja, sollte keine Anschuldigung sein, ich wollte damit nur andeuten, das beide Lösungen funktionieren ...

EDIT: weil dein Code halt anders aussieht und du bissl mehr optimiert hast
Gruß Simon