sgetn не завершает строку нулем

sgetn Принимает char* в качестве первого аргумента и записывает в него символы. Он не записывает '\0' в конце char*.

Такое поведение кажется несовместимым с каждым другим случаем, когда я могу найти запись char*. Однако он одинаков для Clang, gcc и Visual Studio, поэтому я не могу поверить, что это ошибка, которая есть во всех компиляторах.

Есть ли причина, по которой стандарт не требует '\0' в конце char*?

[Живой пример]


person Jonathan Mee    schedule 07.12.2015    source источник


Ответы (1)


Потому что его можно использовать для чтения произвольных данных, а не только текста.

Возьмите, например. функция std::istream::read, она также принимает char*, но может использоваться для чтения произвольных данных, включая двоичные данные. Вы не ожидаете, что он добавит терминатор строки при чтении из двоичного файла?

person Some programmer dude    schedule 07.12.2015
comment
Подождите, это basic_streambuf. fstream::rdbuf возвращает basic_filebuf, который, как я полностью ожидаю, должен быть способен чтение бинарных данных. Какой смысл читать двоичные данные из stringstream (и соответственно из basic_streambuf)? - person Jonathan Mee; 07.12.2015
comment
@JonathanMee std::basic_streambuf — это базовый класс для всех классы буферов потоков. И ничто не мешает std::string содержать двоичные или произвольные данные. - person Some programmer dude; 07.12.2015
comment
Я думаю, что ваше обоснование настолько хорошо, насколько я могу надеяться. Но то, что string может содержать двоичные данные, не мешает data() добавлять '\0'. Вероятно, это просто меня расстроило то, что мне потребовалось так много времени, чтобы определить тот факт, что мои char* не были '\0' прекращены. Спасибо за ответ. - person Jonathan Mee; 07.12.2015