Schleife mit fstream klappt nicht
-
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
-
Upps, habe ich mal wieder alles etwas eng gesehen. Na, damit ist doch alles geklärt und der Threadersteller hat was er wollte

-
It0101 schrieb:
muss nicht, kann aber schon

wo ist der unterschied ob ich es drinne lasse oder nicht ?
-
Ok, kannst es auch rausnehmen, weil er dann einfach nicht in die while-schleife geht -> getline gibt 0 zurück
Wenn du's drinlässt, beendet er das Programm halt sofort ....
Gruß Simon
-
varginator schrieb:
Ok, kannst es auch rausnehmen, weil er dann einfach nicht in die while-schleife geht -> getline gibt 0 zurück
Wenn du's drinlässt, beendet er das Programm halt sofort ....
Gruß Simon
Ja ging nur darum, weil ich es in ner
void funktion drinne hab.
Lohnt es sich, wegen dem return ein int funktion draus zu machen?