seekp Problem
-
Hallo, in meiner Datei t.exe steht an Offset 0x000364A4 ein A dieses wollte ich durch ein G ersetzen. Aber irgendwie versteh ich das anscheind mit dem seekp nicht da meine Datei immer kaputt geht.
Das hier hab ich mir auch schon dazu durchgelesen hat mir aber nicht viel gebracht.
http://www.cplusplus.com/reference/iostream/ostream/seekp/Weiss jemand was an meinem Code falsch ist?
#include <fstream> #include <iostream> using namespace std; int main () { ofstream outfile; outfile.open ("t.exe"); outfile.seekp ( 0x000364A4, ios_base::beg ); outfile.write ("G",1); outfile.close(); return 0; }
-
Ich würde den Stream binär öffnen (ios::binary). Mal gucken obs was bringt.
-
theta schrieb:
Ich würde den Stream binär öffnen (ios::binary). Mal gucken obs was bringt.
Na, nicht rumraten. ios::binary ändert bloß, wie ein newline behandelt wird und hat auch effektiv nur unter Windows überhaupt eine Auswirkung und in diesem Programm kommen keine newlines vor.
Was wir wollen, ist a: schreiben können, b: alten Inhalt nicht verwerfen, c: Schreibzeiger setzen können.
Für a brauchen wir ios::out, für b ios::in oder ios::app, für c müssen wir ios::app ausschließen. Daher:
#include <fstream> using namespace std; int main () { fstream outfile("test.dat", ios::out | ios::in); outfile.seekp (2, ios::beg); outfile.put ('G'); }
-
theta hatte anscheind nicht ganz unrecht mit dem ios::binary so funktioniert es :>
ty@ theta & SeppJ
#include <fstream> #include <iostream> using namespace std; int main () { fstream outfile("t.exe", ios::out | ios::in | ios::binary); outfile.seekp (0x000364A4, ios::beg); outfile.put ('G'); outfile.close(); return 0; }
-
Das close ist unnötig. Außerdem solltest du dafür std::ofstream verwenden, da du nur schreiben möchtest.
http://www.cplusplus.com/reference/iostream/ofstream/
-
Schreiben ohne was zu verwerfen -> ios::app | ios::in. Oder können wir ios::in auch für einen ofstream anwenden, wenn wir nicht wirklich etwas lesen wollen?
-
Eisflamme schrieb:
Schreiben ohne was zu verwerfen -> ios::app | ios::in. Oder können wir ios::in auch für einen ofstream anwenden, wenn wir nicht wirklich etwas lesen wollen?
Du kannst
in
auch auf ostreams anwenden. AFAIK ist der einzige Unterschied der fstreams der Default-Openmode und die Auswahl der Memberfunktionen.In diesem Sinne hätte ich oben natürlich auch einen ofstream benutzen können, um klarer zu machen, dass ich wirklich nur schreiben will.
-
SeppJ schrieb:
Eisflamme schrieb:
Schreiben ohne was zu verwerfen -> ios::app | ios::in. Oder können wir ios::in auch für einen ofstream anwenden, wenn wir nicht wirklich etwas lesen wollen?
Du kannst
in
auch auf ostreams anwenden. AFAIK ist der einzige Unterschied der fstreams der Default-Openmode und die Auswahl der Memberfunktionen.In diesem Sinne hätte ich oben natürlich auch einen ofstream benutzen können, um klarer zu machen, dass ich wirklich nur schreiben will.
ofstreams erben doch nur von ostream und haben von daher keine istream Funktionalität ala read().
-
AFAIK ist der einzige Unterschied der fstreams der Default-Openmode und die Auswahl der Memberfunktionen.
Aber den openmode darfst du trotzdem setzen und es macht auch das was es soll.