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'?

4

1 回答 1

6

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

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

于 2011-06-13T13:48:49.353 回答