Binärdateien teilweise überschreiben
-
Ich will einen code schreiben, der den 11. Byte (also stelle 10) mit "1D" (0x steht für hexadezimal) überschreibt. Dazu hab ich folgenden code erstellt:
#include <fstream> using namespace std; ofstream output; int main() { output.open("C:\\2.z64", ios::binary | ios::out); output.seekp(10,ios_base::beg); output.put (0x1D); output.close(); }Das Problem:
Alles, was nach dem 11. Byte kommt, wird gelöscht. Außerdem wird alles, was davor kommt zu "00";
Meine Idee war, das alles Temporär in eine 2. Datei zu speichern und es danach zu editieren. Das Problem ist, dass das bei den Dateien, die ich später bearbeiten muss, etwa 2 Minuten dauern würde (vielleicht war meine Methode auch einfach schlecht...). Kann mir jemand verraten, wie ich dir Bytes direkt bearbeiten kann?
-
Du öffnest die Datei im truncate Mode. Die Datei wird quasi vor dem öffnen gelöscht und neu erstellt mit keinem Inhalt.
Nimm einfach std::ios::app und setzt den Stream auf den Anfang zurück, dann kannst du mittendrin rumwurschteln.
Alternativ und manchmal besser ist das komplette Einlesend er Datei. Dann bearbeitest du den Inhalt in deiner Datenstruktur und schreibst alles wieder in eine frische Datei.
-
Skym0sh0 schrieb:
Du öffnest die Datei im truncate Mode. Die Datei wird quasi vor dem öffnen gelöscht und neu erstellt mit keinem Inhalt.
Nimm einfach std::ios::app und setzt den Stream auf den Anfang zurück, dann kannst du mittendrin rumwurschteln.
Alternativ und manchmal besser ist das komplette Einlesend er Datei. Dann bearbeitest du den Inhalt in deiner Datenstruktur und schreibst alles wieder in eine frische Datei.
wenn ich's mit ios::app öffne, schreibt er immer ans ende, egal wie ich .seekp setze;
das mit dem truncate mode hat mir allerdings geholfen^^ wenn ich's mit ios::in öffne, bleibt mir die alte Datei erhalten.
-
Kazeshin schrieb:
Ich will einen code schreiben, der den 11. Byte (also stelle 10) mit "1D" (0x steht für hexadezimal) überschreibt. Dazu hab ich folgenden code erstellt:
#include <fstream> using namespace std; ofstream output; int main() { output.open("C:\\2.z64", ios::binary | ios::out); output.seekp(10,ios_base::beg); output.put (0x1D); output.close(); }Das geht nicht. Du kannst nur hinten etwas anhängen, mehr nicht. Siehe auch hier: http://www.c-plusplus.net/forum/318605-full
Ansonsten einfach Datei einlesen, bearbeiten, komplett zurückschreiben. Und wieso soll das 2 Minuten dauern? Du kannst eine 100MB Datei innerhalb Sekunden einlesen.
-
out schrieb:
Kazeshin schrieb:
Ich will einen code schreiben, der den 11. Byte (also stelle 10) mit "1D" (0x steht für hexadezimal) überschreibt. Dazu hab ich folgenden code erstellt:
#include <fstream> using namespace std; ofstream output; int main() { output.open("C:\\2.z64", ios::binary | ios::out); output.seekp(10,ios_base::beg); output.put (0x1D); output.close(); }Das geht nicht. Du kannst nur hinten etwas anhängen, mehr nicht. Siehe auch hier: http://www.c-plusplus.net/forum/318605-full
Klar geht das. Du kannst bloß nichts einfügen in der Mitte.
-
SeppJ schrieb:
out schrieb:
Kazeshin schrieb:
Ich will einen code schreiben, der den 11. Byte (also stelle 10) mit "1D" (0x steht für hexadezimal) überschreibt. Dazu hab ich folgenden code erstellt:
#include <fstream> using namespace std; ofstream output; int main() { output.open("C:\\2.z64", ios::binary | ios::out); output.seekp(10,ios_base::beg); output.put (0x1D); output.close(); }Das geht nicht. Du kannst nur hinten etwas anhängen, mehr nicht. Siehe auch hier: http://www.c-plusplus.net/forum/318605-full
Klar geht das. Du kannst bloß nichts einfügen in der Mitte.
Ah er will ersetzen und nicht einfügen.