Записать массив символов с нулевыми значениями в поток файлов - PullRequest
0 голосов
/ 04 июля 2019

Я новичок в c ++ и до сих пор выясняю потоки файлов.Я пытаюсь поместить массив символов в файл, который буду просматривать с помощью шестнадцатеричного редактора.

Я создал разные строки, но всякий раз, когда я вставляю нулевой байт, файл заканчивается.

ofstream stream;
char charArray[256];
for (int i = 0; i <= 255; i++)charArray[i] = i;
stream.open("C:\\testfile.myimg");
if (!stream.is_open()) exit(1);
stream << charArray << endl;
return 0;

Я хочу вывести байты с возрастающими значениями, но если я начну с нулевого байта, то C ++ думает, что массив символов заканчивается до его запуска

1 Ответ

2 голосов
/ 04 июля 2019

Вместо:

stream << charArray << endl;

используйте:

stream.write(charArray, sizeof(charArray));
stream.write("\n", 1);  // this is the newline part of std::endl
stream.flush();         // this is the flush part of std::endl

Первый предполагает, что вы отправляете строку с нулевым символом в конце (потому что выпрохождение char* - см. конец ответа почему).Поэтому, когда код встречает самый первый char со значением 0, равным '\0' (нулевой терминатор), он останавливается.

С другой стороны, во втором подходе используется неотформатированныйвыходная запись, которая не будет заботиться о значениях внутри charArray - она ​​возьмет его (как указатель на свой первый элемент) и запишет sizeof(charArray) байт , начиная с этого указателя, до stream.Это безопасно, поскольку гарантируется, что sizeof(char) == 1, таким образом, sizeof(charArray) даст 256.

. Вам нужно учесть, что затухание массива .В этом случае он будет работать (вещь sizeof), но не будет работать, если вы просто передадите затухший указатель на первый элемент массива.Подробнее здесь: что распадается массив?

...