Чтение / запись управляющих символов в двоичном файле - PullRequest
0 голосов
/ 24 августа 2018

Я сейчас обрабатываю двоичный файл, используя C ++ ...

В какой-то момент я прочитал байт, и символ * прочитал "\ x3", который кажется управляющим символом.

Но когда мне нужно написать его обратно, используя:

const char *control = "\x3";
fout.write(control, sizeof(control));

А потом я читаю двоичный файл обратно в значение чтения "\ x11C".

Как записать массив управляющих символов обратно в файл правильным способом?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Другой способ записи строковых литералов заключается в объявлении их в виде массива:

static char const  data[] = "Hello World!\n";
fout.write(data, sizeof(data) - 1U);

- 1U означает, что завершающий NUL не записывается.Удалите по своему усмотрению.

Поскольку массив data объявлен без емкости, поэтому компилятор определяет длину на основе содержимого.

Можно использовать sizeof, поскольку размер символа равен 1 (по определению).

Хорошим преимуществом этого метода является то, что размер известен во время компиляции.Поиск по длине не требуется.

0 голосов
/ 24 августа 2018

Ваш код записывает 4-8 символов в двоичный файл вместо 1, который вы ожидаете получить.control рассматривается как обычный указатель, а sizeof(control) интерпретирует указанный указатель без учета данных, на которые он указывает, и возвращает значение 4-8.

Лучший способ исправить это -объявите control как один символ, как вы, вероятно, и предполагаете:

char control = '\x3';
fout.write(&control, sizeof(control));

Другой способ, если вам действительно нужно написать несколько символов, выглядит следующим образом:

const std::string control = "\x3";
fout.write(control.data(), control.size());

Любой метод будет правильно выводить ожидаемое количество символов.

...