Schleife mit fstream klappt nicht



  • 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



  • 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?



  • Du kannst ja ne bool-funktion draus machen ...

    Ich persönlich finde es besser eine bool-funktion zu haben, man kann dann nämlich auf erfolg prüfen

    Gruß Simon


Anmelden zum Antworten