C ++ заменяет данные в двоичном файле на fstream - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь заменить данные в двоичном файле, используя C ++ и библиотеку fstream.Возможно ли это сделать с помощью этой библиотеки?Я хотел бы изменить один байт файла в адресе: 0xB07 на 1.

Я написал следующий фрагмент кода:

...

int address = 0xB07;
char * toChange = new char('0');

std::ifstream input(filename, std::ios::binary);
input.seekg(address);
input.read(toChange, 1);
input.close();

*toChange = (char)0x01;

std::ofstream output(filename, std::ios::binary);
output.seekp(address);
output.write(toChange, 1);
output.close();

...

Я перепробовал много версий этого кода, и я до сих порне могу понять, почему байт не меняется.

1 Ответ

0 голосов
/ 22 ноября 2018

Этот код удалит ваш файл и поместит в него совершенно новое содержимое.Проблема в строке

std::ofstream output(filename, std::ios::binary);

Это потому, что режим открытия по умолчанию ios::out | ios::trunc (см., Например: Ввод / Вывод с файлами ). Это означает, что файл обрезается до нуля.байт.

Затем ваша функция seek () расширяет его до указанного размера (обычно с заполнением нулями) и, наконец, output.write() записывает байт в конце.

Для того, чтобы сделать чтоВы хотите Я должен был указать следующие флаги ofstream: std::ios::binary|std::ios::out|std::ios::in

В настоящее время я не могу точно сказать, зачем нужен std::ios::in, извините ...

...