【问题标题】:Does there exist an "unput" for std::ostream like there exists "unget" for std::istream?std::ostream 是否存在“输入”,就像 std::istream 存在“u get”一样?
【发布时间】:2010-12-10 23:05:26
【问题描述】:

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

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

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

这不是关键任务或类似的东西,但我很好奇以前是否有人遇到过这种情况。

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    流与邮件非常相似。在流上发送的每条消息就像一封信,消息可以排队进入缓冲区,缓冲区就像邮箱。

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

    如果你把一封信放在你女朋友的邮箱里,你真的无法控制她什么时候会检查她的邮箱并取出所有的信件。可能是她坐在门边,当它通过槽口时,她会马上把信抢过来读。

    更有可能的是,您实际上是将信件投递到邮局(操作系统)拥有的邮箱。尽管许多这样的容器只是垃圾箱,邮递员每天检查一次,但可能是插槽直接连接到分拣机,信件在您放下的那一刻就送达了。

    在具有并发性的流接口中,没有通用的方法可以在写入后重新获得写入的所有权。如果您需要,您应该在您和流之间放置一个中间缓冲区,并且只有在您知道确定准备好时才将其刷新到流中。

    【讨论】:

    • 有点想是这样的。我认为从长远来看,我根本不会允许使用\b(老实说,在这个应用程序的上下文中确实不需要这样做)并且不必担心。只是那些奇怪的“我想知道我是否可以......”问题之一。
    • 你可以设置一个本地缓冲区来处理\bs;人们普遍认为退格不能“撤消”换行符,因此您一次只需要缓冲一行。顺便说一句,当命令行在标准输入上将信息传递给您的程序时,它已经这样做了。或者您可以发送文字退格字符,让接收端决定如何处理它们。
    【解决方案2】:

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

    【讨论】:

    • 这是我的一个想法。如果退格是字符串中的最后一个字符,则问题可能会出现 - 即使我 seekp 后退一个字符,当我在 ostringstream 上调用 str() 时,我仍然会得到最后一个字符吗?
    【解决方案3】:

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

    int pending_ch = -1; 无效输出字符(int ch) { 如果 (pending_ch >= 0) putch(F, ch); 未决通道 = 通道; } 无效 unput_char(无效) { 未决通道 = -1; } 无效 force_put_char(无效) { 输出字符(-1); }

    有点笨拙,但这种通用方法对于延迟输出到流很有用。

    【讨论】:

    • 如果他连续想要多个退格会怎样?
    • 那么必须缓冲更多的字符。然而,与 ungetc 的类比只需要一个“收回”字符。
    【解决方案4】:

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

    【讨论】:

    • 在控制台上,是的,它按预期工作,但我只是在处理内存中的数据......字符串可能显示也可能不显示,而且很可能在一个简单的 GUI 中。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2019-02-23
    相关资源
    最近更新 更多