file stream: Bytes überschreiben statt ganze Datei ersetzen



  • Hallo Coder

    diese Frage stelle ich mir schon seit einiger Zeit, nun hänge ich mit dem Problem aber konkret in meinem aktuellen Programm fest:

    Wie kann ich per file stream (FILE, fstream oder andere, falls es welche gibt) einzelne Byteblöcke ERSETZEN/ÜBERSCHREIBEN, sodass die anderen, unbearbeiteten Bytes erhalten bleiben? Wenn ich eine Datei zum Schreiben öffne, wird eine allenfalls schon bestehende Datei immer gelöscht, was ich natürlich nicht will.
    Als kleine Info: Die Dateien, die ich modifizieren will, können schon mal ein paar GB gross sein, die ganze Datei in den Speicher zu laden dürfte also keine Option darstellen.



  • schau dir mal alles rund um fseek an

    fseek move to a specific location in a file

    http://www.cppreference.com/stdio/index.html



  • Kenn ich, damit lässt sich der Lese-/Schreibkopf an eine bestimmte Stelle versetzen. Mein Problem ist aber im Wesentlichen, dass ich nicht weiss, wie ich eine bestehende Datei zum Schreiben öffne, ohne dass sie geleert wird...



  • Hier ein kleines Beispiel:

    #include<fstream>
    
    int main()
    {
        std::fstream f("test.txt");
        f.seekg(5);
        f.put('K');
    }
    

    Die Datei ändert sich dann so:

    0123456789
    
    01234K6789
    

    mfg.



  • Danke für deine Hilfe, so scheint's zu funktionieren. Bislang habe ich immer ifstream und ofstream verwendet, zusammen mit ios::in, ios::out und ios::binary. Damit geht's dann nämlich irgendwie nicht.

    Was mir noch ein Bisschen Sorge macht, ist der binary mode ios::binary. Dein Code funktioniert nur dann, wenn kein ios::binary verwendet wird. Ich möchte allerdings sichergehen, dass alle Daten binär gelesen werden. Ist das automatisch der Fall oder gibt's dafür einen anderen Befehl?



  • Praetorian schrieb:

    Danke für deine Hilfe, so scheint's zu funktionieren. Bislang habe ich immer ifstream und ofstream verwendet, zusammen mit ios::in, ios::out und ios::binary. Damit geht's dann nämlich irgendwie nicht.

    Was mir noch ein Bisschen Sorge macht, ist der binary mode ios::binary. Dein Code funktioniert nur dann, wenn kein ios::binary verwendet wird. Ich möchte allerdings sichergehen, dass alle Daten binär gelesen werden. Ist das automatisch der Fall oder gibt's dafür einen anderen Befehl?

    Du kannst als Modus "ios::in|ios::out|ios::binary" angeben (Lesen und Schreiben im Binärmodus).



  • Hmm, zusammen mit ios::in | ios::out funktioniert ios::binary korrekt, ohne nicht. Da verstehe einer fstream... 🙄

    Naja, egal, nun funktioniert es. Danke für eure Tipps!


Anmelden zum Antworten