#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, как вы говорите, и теперь все работает.