Schleife mit fstream klappt nicht
-
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; }
-
#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
