Это всего лишь вопрос обработки правильного вывода в вашей оболочке.
Представьте себе это:
cat file_with_nulls
Это будет опрометчиво выводить содержимое file_with_nulls
на консоль, и, конечно, консоль может быть не оборудована для отображения непечатных символов. Тем не менее, следующие работы:
cat file_with_nulls > otherfile
Это создаст идеальную копию file_with_nulls
.
То же самое работает с вашей программой. Вы можете написать что угодно в стандартный вывод. Но не ждите, что ваш терминал или консоль сделают с ним что-нибудь полезное! Скорее, перенаправьте вывод в файл, и все хорошо:
./myprog > output.bin
Обратите внимание, что строковые операции C обычно не работают с нулевыми байтами, поэтому в C вы должны использовать fwrite()
. В C ++ строки могут содержать любой символ, поэтому std::cout << str;
всегда работает. Однако построение std::string
из массива символов C останавливается на нулевом байте, поэтому вы должны использовать другой конструктор:
char cstr[] = { 'H', 'e', 0, 'l', 'l', 'o', 0 };
std::string s1(cstr); // wrong, gives you "He"
std::string s2(cstr, sizeof(cstr)); // correct