Schleife mit fstream klappt nicht



  • 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ßen
    

    Hey 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=Peter

    Soll 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 Testzeile
    

    Nach 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


Anmelden zum Antworten