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

StackOverflow https://stackoverflow.com/questions/6331282

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top