【问题标题】:Non-destructible read from a stream从流中读取不可破坏
【发布时间】:2010-11-16 20:47:38
【问题描述】:

是否可以尝试从流中读取但不更改流本身(并返回 bool 是否成功)?

template <typename T> bool SilentRead (stringstream& s, T& value) {
    stringstream tmp = s;
    tmp >> value;
    return tmp;
}

这不起作用,因为 stringstream 没有公共复制构造函数。 那怎么办呢?

如果我们用 istream 替换 stringstream 是否可以解决?

【问题讨论】:

    标签: c++ io stream


    【解决方案1】:

    一般来说这是不可能的。底层的 streambuf 没有接口。但是,您可以创建一个 streambuf 包装器。您仍然无法在流上执行不可破坏的读取,但您可以在您的 streambuf 包装器上执行它们。

    (streambuf 包装器是 std::streambuf 接口的实现,它将其 I/O 转发到底层 streambuf)

    【讨论】:

      【解决方案2】:

      StringStream,引用this 允许您使用tellgseekg 来获取/设置位置。所以你可以:
      1. 获取当前位置
      2. 阅读
      3. 将当前位置设置为您刚刚阅读的位置。

      【讨论】:

      • 当然:)。我严格指的是 std::stringstream (也适用于普通文件上的流)。
      【解决方案3】:

      【讨论】:

      • peek 只能向前看一个字符,不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      相关资源
      最近更新 更多