流缓冲区实现中std::endl和'\n'之间的区别

10

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


2
"<< std::endl" 的确是指 "<< '\n' << std::flush;"。 - Lightness Races in Orbit
有更简单的方法来完成你想要做的事情。也许如果你提出关于实际问题的问题,你可以得到关于最佳解决方案的建议。 - Martin York
1个回答

6

你无法重载sputc,因为sputc不是虚函数。你需要重载overflowsync,并检查整个挂起的序列是否包含\n

除非你了解支持流类型的设备特殊信息并可以执行某种最优化操作,否则通常不需要重载xsputn


我昨天自己发现了这一点,像你说的那样重载了溢出,现在一切都正常了。 - crispinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接