是否存在std :: ostream的“输入”,就像std :: istream存在“u get”一样?

时间:2010-12-10 23:05:27

标签: c++ iostream

我有一些解析代码,允许将转义序列输入到一串文本中:

// In a file or large, multi-line string ...
my_parameter="A setting for the parameter\nthat contains \"escape sequence\" characters"

当我解析它时,我处理反斜杠并使用std::ostringstream实例将相应的字符添加到我正在构建的字符串中。换行,引号,反斜杠等都可以正常工作。但是,我正在考虑是否允许\b序列,并且想要查看我是否可以从我的ostringstream中“输出”最后一个字符,就像你可以从任何{{1}“取消” }}。你能做这样的事吗?如果该函数不存在,是否有一种简单的方法将写入位置推回一个字符并简单地让下一个字符读取覆盖它?

这不是关键任务或其他任何类似的事情,但我很好奇其他人是否曾遇到此问题。

4 个答案:

答案 0 :(得分:9)

Streams非常像邮件。在流上发送的每条消息都像一个字母,消息可以排队到缓冲区,就像邮箱一样。

如果你负责将邮件放入邮箱并从邮箱中取出邮件,那么你当然可以知道你刚刚放在那里的一封信仍然可以收回。当然,你可能根本不会把它放在邮箱里,因为你拥有两端。

如果相反,你在你的女朋友邮箱里写了一封信,你真的无法控制她什么时候检查她的邮箱并取出所有的信件。可能是她正坐在门边,一旦它通过插槽,就会立即抓住这封信并将其读出来。

更有可能的是,您实际上是将信件发送到邮局(操作系统)所拥有的信箱。虽然许多这样的容器只是垃圾箱,邮件承运人每天检查一次,但是可能是插槽直接连接到分拣机,并且即使您放下它也会发送信件。

在具有并发性的流式界面中,没有通用的方法来重写一次写入的所有权。如果您需要,您应该在您和流之间放置一个中间缓冲区,并且只有当您知道确定已准备就绪时才将其刷新到流中。

答案 1 :(得分:1)

您可以使用seekp设置流中光标的位置(请参阅:http://cplusplus.com/reference/iostream/ostream/seekp/)。

答案 2 :(得分:0)

如果你想收回一个角色,在你确定你不想要收回它之前不要发送它。您可以实现自己的“允许回收”逻辑:

int pending_ch = -1;
void output_char(int ch)
{
  if (pending_ch >= 0)
    putch(F, ch);
  pending_ch = ch;    
}
void unput_char(void)
{
  pending_ch = -1;
}
void force_put_char(void)
{
  output_char(-1);
}

有点笨重,但这种通用方法可以将输出延迟到流。

答案 3 :(得分:0)

您可以自己输入退格字符。我至少在Windows控制台中完成了它。这应该确保无论目的地如何都能观察到正确的行为。