Mitten in eine Datei schreiben



  • Hallo,

    ich habe eine Datei voller Text und möchte gerne inmitten dieses Textes etwas einfügen. Dafür bräuchte ich eine Funktion, der ich einen fstream und ein string übergeben kann, hinter den der neue Text eingefügt werden soll. Mein Problem liegt darin den Dateizeiger an die richtige Stelle zu setzen und dann vor allem, dass der alte nachfolgende Text nicht überschrieben sondern einfach wieder an den neuen Text angehängt wird. Kann mir jemand erklären, wie ich das implementieren könnte?

    Danke schon einmal im Voraus!



  • Ich würde als erstes eine neue, temporäre Datei anlegen. In diese schreibe ich alle Bytes aus der Original-Datei bis zu Deinem gesuchten String. Dann kommen natürlich alle Bytes des einzufügenden Strings. Und zum Schluss kopiere ich den Rest des Textes.
    Nach einer eventuellen Überprüfung kann die Originaldatei gelöscht werden und die temporäre Datei umbenannt.



  • @gruffelo

    kurz und schmerzlos: Datei aufteilen, also ein Teil als substr von 0 bis zur gewünschten Position und der andere Teil ist der Rest. Dann ergibt sich der neue Inhalt zu teil_1 + hinzu + rest und den schreibst einfach wieder rein nachdem Du die Datei auf 0 gekürzt hast (truncate).

    MFG



  • Hat funktioniert. Tausend Dank 🙂



  • @daMicha sagte in Mitten in eine Datei schreiben:

    Nach einer eventuellen Überprüfung kann die Originaldatei gelöscht werden und die temporäre Datei umbenannt.

    Am besten als atomare Operation, also umbenennen+überschreiben in eins. Dann hast du nie einen kaputten State, wo die Originaldatei fehlt und du nur eine Temp-Datei hast.

    ReplaceFileW unter Windows oder rename bei Posix-Systemen.


  • Gesperrt

    @wob sagte in Mitten in eine Datei schreiben:

    ReplaceFileW unter Windows oder rename bei Posix-Systemen.

    Während dem Generieren des neuen Dateiinhalts und vor dem rename könnte sich doch jemand anderes an der Datei "zu schaffen gemacht" haben... Das rename ist zwar atomar, aber der Rest nicht...


Anmelden zum Antworten