将Ostream传递到Istream中。

3

我有一个输出数据到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
}

那么我该如何将第一个函数的输出推送到第二个函数的输入?我尝试了很多方法,大多数都是试错,但我完全迷失了方向(即不确定要使用哪种流类型)。谢谢。


2
这取决于您传递的数据类型。如果您要将其输出到屏幕上,那么很可能您会将其转换为某种字符串,因此您应该使用stringstream。 - user1508519
它是一个可读性强的对象格式,也可以用于初始化新对象。Stringstream听起来像个好主意。 - Lobe
你到底为什么要将一个的结果推入另一个中?直接写一个复制构造函数不就好了! - Mooing Duck
哈哈,这不是我设计的。这个想法是要有一个可理解的格式,可以保存到文件中。为了测试,我只想暂时绕过所有与文件相关的工作。还有一个复制构造函数将用于复制。 - Lobe
1个回答

6

由于需要输入和输出,所以需要一个派生自std::iostream的导数,它同时继承了std::istreamstd::ostream。看起来你想使用内存缓冲区而不是文件缓冲区,因此可以使用std::stringstream类型的对象。但是在使用它进行输入之前,请务必调用stream.seekg(0, std::ios::beg)将流“倒回”到开头。

这段代码也可以重复使用于文件I/O中,只需将std::fstream传递给相应的函数即可。但是由于写入和读取将被分离,因此std::ofstreamstd::ifstream可能是更好的选择。


你能解释一下“倒回数据流”的部分吗?当执行 stream.seekg(0, std::ios::beg) 时会发生什么,为什么在使用数据流进行输入之前必须这样做? - helmesjo
1
@helmesjo 流中只有一个当前位置,读和写都共享它。在没有 seek 的情况下从写切换到读是未定义的行为。因此,如果您向空文件写入一些文本,然后立即尝试读取,则结果可能为空(因为位置在结尾)或者是垃圾数据(因为是未定义的行为)。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接