Различия между 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
, если вы не можете сделать что-то оптимальное, потому что вы знаете что-то особенное о устройстве, которое поддерживает ваш тип потока.