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

#c #stringbuffer #endl

#c #stringbuffer #endl

Вопрос:

В настоящее время я пытаюсь реализовать подкласс 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’.

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

Комментарии:

1. << std::endl точно делает << 'n' << std::flush; .

2. Есть более простые способы сделать то, что вы пытаетесь сделать. Возможно, если вы зададите вопрос о реальной проблеме, вы сможете получить совет о наилучшем способе ее решения.

Ответ №1:

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

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

Комментарии:

1. Я сам обнаружил это вчера и перегрузил overflow, как вы говорите, и теперь все работает.