Различия между std :: endl и '\ n' для реализаций потокового буфера
-
27-10-2019 - |
Вопрос
В настоящее время я пытаюсь реализовать подкласс stringbuf, чтобы позволить буферу токенизироваться для определенных символов ('\ n' в моем случае) и предпринимать действия, если этот символ возникает (выгрузить сообщение в регистратор и очистить буфер потом в моем случае). Для достижения этой цели я переопределил sputc (чтобы реализовать наблюдение за '\ n') и xsputn (чтобы действительно использовать sputc, поскольку реализация GCC, похоже, не делает этого по умолчанию). В целях отладки я позволил sputc записывать каждый переданный ему символ в stdout.
Вот мой вопрос: если я использую что-то вроде
родовое словоsputc получает каждый символ, кроме символа '\ n', который должен быть введен std :: endl, поэтому ожидаемое действие не выполняется, потому что '\ n' не передается. Если я использую что-то вроде
родовое словоили даже
родовое слововсе работает, как ожидалось, и моя реализация sputc получает символ '\ n'.
Итак, мой вопрос: не должны ли обе строки кода делать то же самое в отношении строкового буфера позади, а если нет, то какие другие методы мне нужно переопределить, чтобы получить '\ n'?
Решение
Вы не можете переопределить sputc
, потому что sputc
не является виртуальным.Вам необходимо перегрузить overflow
и sync
и проверить всю ожидающую последовательность на наличие вхождений \n
.
На самом деле вам не нужно перегружать xsputn
, если вы не можете сделать что-то оптимальное, потому что вы знаете что-то особенное об устройстве, поддерживающем ваш тип потока.