Различия между std:: endl и '\n' для реализаций streambuffer

В настоящее время я пытаюсь реализовать подкласс stringbuf, чтобы позволить токенизировать буфер для определенных символов ('\n' в моем случае) и предпринять действие, если этот char происходит (выдает сообщение журналу и после этого очистите буфер в моем случае). Для достижения этой цели я перепробовал sputc (для реализации наблюдения за "\n" ) и xsputn (для использования sputc действительно, поскольку реализация GCC, похоже, не делает этого по умолчанию). Для целей отладки я позволяю sputc записывать каждый символ, который передается ему в стандартный вывод.

Теперь это мой вопрос: если я использую что-то вроде

mystream << "Some text" << std::endl;

sputc получает каждый символ, кроме '\n', который должен быть введен в действие std:: endl, поэтому ожидаемое действие не выполняется, потому что '\n' не передается. Если я использую что-то вроде

mystream << "Some text" << '\n';

или даже

mystream << "Some text" << "\n" << std::flush;

все работает так, как ожидалось, и моя реализация sputc получает '\n' char.

Итак, мой вопрос: не должны ли обе строки кода делать то же самое в отношении stringbuf позади, а если нет, какие другие методы мне нужно переопределить, чтобы получить '\n'?

Ответ 1

Вы не можете переопределить sputc, потому что sputc не является виртуальным. Вам нужно перегрузить overflow и sync и просмотреть всю ожидающую последовательность для вхождений \n.

Вам не нужно перегружать xsputn, если вы не можете сделать что-то оптимальное, потому что вы знаете что-то особенное о устройстве, которое поддерживает ваш тип потока.