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
-
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!