Различия между std :: endl и '\ n' для реализаций потокового буфера - PullRequest
10 голосов
/ 13 июня 2011

В настоящее время я пытаюсь реализовать подкласс stringbuf, чтобы позволить токену буфера для определенных символов ('\ n' в моем случае) и предпринять действие, если этот символ встречается (выгрузить сообщение в логгер и очистить буфер потом в моем случае). Чтобы достичь этой цели, я переопределил 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'.

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

1 Ответ

6 голосов
/ 13 июня 2011

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

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

...