流缓冲区实现的std :: endl和'\ n'之间的区别
-
27-10-2019 - |
题
我目前正在尝试实现stringbuf的子类,以允许缓冲区为特定字符(在本例中为'\ n')进行标记化,并在该字符出现时采取措施(将消息转储到记录器并清除缓冲区)之后是我的情况)。 为了实现这个目标,我覆盖了sputc(实现监视'\ n')和xsputn(确实使用sputc,因为GCC实现默认情况下不这样做)。 出于调试目的,我让sputc写出传递给它的每个字符到stdout。
现在这是我的问题:如果我使用类似的东西 通用标签
sputc接收每个字符,除了应该由std :: endl引入的'\ n'之外,因此未执行预期的操作,因为未传递'\ n'。 如果我使用类似的东西 通用标签
甚至 通用标签
一切正常,我的sputc实现获得了'\ n'字符。
所以我的问题是:关于后面的字符串缓冲,两条代码行难道不应该完全一样吗?如果没有,我还必须重写哪些其他方法来获得'\ n'?
解决方案
您不能覆盖sputc
,因为sputc
不是虚拟的。您需要重载overflow
和sync
,并检查整个未决序列中是否存在\n
。
除非您可以做一些优化的事情,否则您实际上不需要重载xsputn
,因为您知道支持流类型的设备的一些特殊之处。
不隶属于 StackOverflow