Различия между std :: endl и '\ n 'для реализаций потокового буфера

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

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

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

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

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

или даже

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

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

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

10
задан Lightness Races with Monica 13 June 2011 в 13:54
поделиться