我正在尝试实现stringbuf的子类以允许缓冲区为特定字符标记化(在我的情况下为'\ n')并在发生此字符时执行操作(将消息转储到记录器并清除缓冲区)之后在我的情况下)。 为了实现这个目标,我重写了sputc(实现了对'\ n'的监视)和xsputn(确实使用了sputc,因为GCC实现默认情况下似乎没有这样做)。 出于调试目的,我让sputc写出传递给它的每个字符到stdout。
现在这是我的问题:如果我使用类似
的东西mystream << "Some text" << std::endl;
sputc接收除了应该由std :: endl引入的'\ n'之外的每个字符,因此不会执行预期的操作,因为'\ n'没有被传递。 如果我使用像
这样的东西mystream << "Some text" << '\n';
甚至
mystream << "Some text" << "\n" << std::flush;
一切都按预期工作,我的sputc实现得到'\ n'字符。
所以我的问题是:两个代码行不应该对后面的stringbuf完全相同,如果没有,我必须覆盖哪些其他方法来获取'\ n'?
答案 0 :(得分:6)
您无法覆盖sputc
,因为sputc
不是虚拟的。您需要重载overflow
和sync
并检查\n
出现的整个待处理序列。
你不应该真的需要重载xsputn
,除非你能做一些最佳的事情,因为你知道支持你的流类型的设备有什么特别之处。