我目前正在尝试实现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'char。

所以我的问题是:关于后面的stringbuf,两条代码行难道不应该做完全一样的吗?如果不行,我还必须重写哪些其他方法来获得'\n'?

最佳答案

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

除非您可以做一些优化的事情,否则您实际上不需要重载xsputn,因为您知道支持流类型的设备的一些特殊知识。

关于c++ - 流缓冲区实现的std::endl和 '\n'之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6331282/

10-11 18:40