streambuffer实现的std :: endl和'\ n'之间的差异

时间:2011-06-13 13:44:22

标签: c++ stringbuffer endl

我正在尝试实现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'?

1 个答案:

答案 0 :(得分:6)

您无法覆盖sputc,因为sputc不是虚拟的。您需要重载overflowsync并检查\n出现的整个待处理序列。

你不应该真的需要重载xsputn,除非你能做一些最佳的事情,因为你知道支持你的流类型的设备有什么特别之处。