Erste Bytes einer Datei ändern
-
Hallo.
Ich habe auf einem ein paar Dateien, die mehrere GB groß sind. Das einzige Problem ist, dass sie einen kleinen Schönheitsfehler haben: Am Anfang - also wenn ich es im Hex-Editor lese - sind die ersten beiden Zahlen 00. Sie müssten aber korrekterweise 9A sein.
Wenn ich nun bei einigen Dateien im Hex-Editor das abändere und die Datei speichere, dauert das SEEEEEEEEEEEEEHR lange, weil die ganze Datei kopiert würde. Gibt es eine Möglichkeit, nur diese ersten beiden Zahlen zu ändern?

-
hmm keine ahnung aber vielleicht helfen memory mapped files weiter? Bei mehreren gb wohl allerdings nur unter 64 bit OSsen...
-
Schau doch einfach mal wie lange es dauert, wenn du die Datei einfach mit einem C++-Filestream öffnest, den ersten Byte abänderst und speicherst.
-
Sind die Zahlen binär abgelegt oder im ASCII/Unicode-Format?
-
Icematix schrieb:
Sind die Zahlen binär abgelegt oder im ASCII/Unicode-Format?
Die sind binär gespeichert.
-
So:
std::ofstream file("file.txt"); file.seekp(0, std::ios_base::beg); file.put(9); file.put(4); file.close();
-
#include "stdafx.h" #include <tchar.h> #include <windows.h> #include <iostream> /////////////////////////////////////////////////////////////////////////////// void reportError(const wchar_t* functionName, int errorCode) { std::wcerr << L"\'" << functionName << L"\' has failed with error code " << errorCode << std::endl; } int _tmain(int argc, TCHAR* argv[]) { if (2 != argc) { std::wcerr << L"Syntax: myapp <file>" << std::endl; return EXIT_FAILURE; } HANDLE file = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == file) { reportError(L"CreateFile(..)", GetLastError()); return EXIT_FAILURE; } unsigned char buffer[] = { 0x01, 0x02, 0x03, 0x04 }; DWORD numberOfBytes = sizeof(buffer) / sizeof(buffer[0]); DWORD numberOfBytesWritten = 0; BOOL result = WriteFile(file, buffer, numberOfBytes, &numberOfBytesWritten, NULL); if (FALSE == result) { reportError(L"WriteFile(..)", GetLastError()); } CloseHandle(file); }