Zeile in Datei ersetzen



  • Hallo 🙂
    Ich möchte eine Zeile in einer Datei durch einen neuen Text ersetzen

    std::fstream file;
    
    	file.open("Datei.txt",std::ios::out| std::ios::app);
    
    	//zeile finden und text löschen
    //neuen text eintragen
    
    	file.close();
    

    Aber ich hab keinen Plan wie ich das machen soll...
    Gibt es vlt eine Funktion um den Text einer Zeile zu löschen?
    Danke 🙂



  • lolipoplol schrieb:

    Gibt es vlt eine Funktion um den Text einer Zeile zu löschen?

    nein. Text einlesen, Zeile ändern, geänderten Text zurückschreiben.



  • Aber wie ändere ich die Zeile?
    Gibt es vlt eine Möglichkeit den gesamten Inhalt der Datei zu löschen?
    Würde sonst vorher die Datei in einen vector einlesen, das element der "Zeile" ändern und den vector wieder schreiben...



  • daddy_felix schrieb:

    nein. Text einlesen, Zeile ändern, geänderten Text zurückschreiben.

    lolipoplol schrieb:

    Aber wie ändere ich die Zeile?
    Gibt es vlt eine Möglichkeit den gesamten Inhalt der Datei zu löschen?
    Würde sonst vorher die Datei in einen vector einlesen, das element der "Zeile" ändern und den vector wieder schreiben...

    Wo genau liegt jetzt das Problem?



  • DocShoe schrieb:

    Wo genau liegt jetzt das Problem?

    Ich weiß nicht wie ich den Inhalt der Datei lösche oder wie ich nur eine bestimmte Zeile lösche oder überschreibe...



  • lolipoplol schrieb:

    DocShoe schrieb:

    Wo genau liegt jetzt das Problem?

    Ich weiß nicht wie ich den Inhalt der Datei lösche oder wie ich nur eine bestimmte Zeile lösche oder überschreibe...

    lolipoplol schrieb:

    Würde sonst vorher die Datei in einen vector einlesen, das element der "Zeile" ändern und den vector wieder schreiben...

    Wo ist das Problem mit diesem Ansatz?



  • Habs jetzt rausgefunden Danke 🙂
    Man muss einfach das flag std::ios::trunc setzen. Aber ist das nicht schlechter Stil wenn ich den kompletten vector neu schreib?

    void write_new(std::vector<string>& v)
    {
    	std::fstream file;
    
    	//liest erstmal alle Vokabeln einer Lektion ein
    	file.open("Datei.txt", std::ios::out | std::iostream::trunc);
    
    	for(int i = 0; i < v.size()-1; i++)
    	{
    		v.at(i).write();
    	}
    
    	file.close();
    }
    

  • Mod

    Vernünftige Schreibflags (wie zum Beispiel out und trunc) wären standardmäßig schon gesetzt, wenn du zum Schreiben einen ofstream (output) benutzen würdest. Ebenso sollte man in den meisten Fällen zum Lesen einen ifstream benutzen.

    lolipoplol schrieb:

    Aber ist das nicht schlechter Stil wenn ich den kompletten vector neu schreib?

    Es geht nun einmal nicht anders. "Zeilen" existieren nur auf Anwendungsebene. Dateien sind bloß lange Ketten von Zeichen, die Interpretation, das ein bestimmtes Zeichen davon für einen Zeichenumbruch steht ist eben dies: Interpretationssache. Es gibt keine besondere Repräsentation von Zeilen auf Ebene der Datei selbst, daher gibt es auch keine besonderen Funktionen, um Zeilen aus einer Datei zu löschen oder einzufügen.
    Es ist nicht einmal möglich, einzelne Zeichen aus einer Datei zu löschen oder einzufügen (außer am Ende), man kann ein Zeichen höchstens gegen ein anderes austauschen. Auch dies hat damit zu tun, was eine Datei auf technischer Ebene ist.


  • Mod

    Vernünftige Schreibflags (wie zum Beispiel out und trunc) wären standardmäßig schon gesetzt,

    Seit wann ist denn trunc standardmäßig gesetzt?



  • aus der gcc stdlib:

    // ...
    @c ios_base::out | @c ios_base::trunc is automatically included in
    // ...
    explicit
    basic_ofstream(const char* __s,
    	       ios_base::openmode __mode = ios_base::out|ios_base::trunc)
    : __ostream_type(), _M_filebuf()
    {
    	this->init(&_M_filebuf);
    	this->open(__s, __mode);
    }
    

    EDIT: oder war das eine Trickfrage?



  • SeppJ schrieb:

    lolipoplol schrieb:

    Aber ist das nicht schlechter Stil wenn ich den kompletten vector neu schreib?

    Es geht nun einmal nicht anders.

    Streng genommen geht es auch in-place. Anstatt die ganze Datei im Speicher zu haben, reicht es im Prinzip zwei Filepointer zu haben und den hinteren Teil zu verschieben. Braucht nur konstant viel Speicher. Und wenn die Datei im Voraus dafür vorgesehen wurde, kann man auch ohne Verschieben auskommen.


  • Mod

    Das ist aber merkwürdig:
    http://www.cplusplus.com/reference/fstream/ofstream/ofstream/
    http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream

    Und was sagt der Standard?

    N3797 §27.9.1.11 schrieb:

    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);

    N3337 §27.9.1.11 schrieb:

    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);

    Verwirrt mich extrem.



  • Arcoth schrieb:

    Das ist aber merkwürdig:
    http://www.cplusplus.com/reference/fstream/ofstream/ofstream/
    http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream

    Und was sagt der Standard?

    N3797 §27.9.1.11 schrieb:

    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);

    N3337 §27.9.1.11 schrieb:

    explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out);

    Verwirrt mich extrem.

    😮
    Ich hatte das eigentlich immer als eindeutig gesehen, weil für mich hieß: kein trunc = kein leeren der Datei. (was bei ofstream offensichtlich der Fall ist)


Log in to reply