【问题标题】:Differences between std::endl and '\n' for streambuffer implementations流缓冲区实现的 std::endl 和 '\n' 之间的差异
【发布时间】:2011-09-13 22:45:46
【问题描述】:

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

【问题讨论】:

  • &lt;&lt; std::endl 确实是&lt;&lt; '\n' &lt;&lt; std::flush;
  • 有更简单的方法来做你想做的事。也许如果你问一个关于真正问题的问题,你可以得到关于解决它的最佳方法的建议。

标签: c++ stringbuffer endl


【解决方案1】:

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

你不应该真的需要重载xsputn,除非你可以做一些最优化的事情,因为你知道支持你的流类型的设备的一些特殊之处。

【讨论】:

  • 我昨天自己发现了这个问题,并且如你所说的那样溢出,现在一切正常。
猜你喜欢
  • 2018-06-11
  • 2012-03-27
  • 2012-03-09
  • 2019-03-05
  • 2018-04-13
  • 2011-05-29
  • 2012-11-12
  • 2019-10-14
相关资源
最近更新 更多