【问题标题】:Pass Ostream into Istream将 Ostream 传递到 Istream
【发布时间】:2013-09-16 06:05:42
【问题描述】:

我有一个将数据输出到 ostream 对象的函数,以及一个以完全相同的格式从 istream 对象初始化类的构造函数。即

std::ostream& operator<<(std::ostream &os, const Matrix &m) {
    // Output to os
}

然后

Matrix::Matrix(std::istream& in) {
    // Read from in to construct the object
}

那么如何将第一个函数的输出推送到第二个函数的输入?我尝试了很多东西,主要是反复试验,但完全迷失了(即甚至不确定要使用哪种流类型)。谢谢

【问题讨论】:

  • 这取决于您传递的数据类型。如果您将其输出到屏幕上,您可能会将其转换为某种字符串,因此您将使用字符串流。
  • 它是一种人类可读的对象格式,也可用于初始化新对象。 Stringstream 听起来是个好主意
  • 你到底为什么要将一个结果推到另一个?只需创建一个复制构造函数!
  • 哈哈,这个不是我设计的。这个想法是有一个可以被保存到文件的可理解的格式。为了测试,我只想暂时绕过所有处理文件的工作。还有一个复制构造函数将用于复制。

标签: c++ stream


【解决方案1】:

由于您需要输入和输出,因此您需要继承 std::istreamstd::ostreamstd::iostream 的派生类。听起来您想使用内存缓冲区,而不是文件缓冲区,因此std::stringstream 类型的对象可以解决问题。只需确保调用stream.seekg(0, std::ios::beg) 将流“倒回”到开头,然后再将其用于输入。

此代码也可以用于文件 I/O,只需将 std::fstream 传递给相应的函数即可。但既然写和读会分开,std::ofstreamstd::ifstream 可能是更好的选择。

【讨论】:

  • 你能澄清一下“倒带”部分吗?执行stream.seekg(0, std::ios::beg) 时会发生什么,为什么需要在使用流进行输入之前?
  • @helmesjo 流中只有一个当前位置,由读写共享。在没有中间搜索的情况下从写入切换到读取是 UB。所以如果你将一些文本写入一个空文件,然后立即尝试读取,结果可能是空的(因为位置在末尾)或垃圾(因为 UB)。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 2011-02-22
  • 2013-09-12
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2013-10-10
相关资源
最近更新 更多