将数据插入 istream

Insert data into an istream

我正在从 ifstream 读取数据。我有一个对象,其 operator>> 读取一个整数 n,一个整数 m,然后是 n 行 m 整数(矩阵)。

在我的 ifstream 中,我有一个矩阵列表,但每个矩阵块的开头没有整数 n 和 m。尽管如此,我还是想使用对象的 >> 运算符来阅读 istream

我不想改变我的 operator>>。此外,我不会在我的文件中的每个矩阵之前添加行数和列数,因为它们是常量。

那么有没有办法将这两个固定值的整数插入到我的ifstream中,以便能够使用矩阵的现有运算符>>

3行4列矩阵数据文件:

0 1 2 5
1 4 8 6
1 4 7 3

4 5 6 8 
6 9 7 2
8 7 9 4

...

没有

istream 是输入流。这是一种单向数据流。您不能以其他方式将数据放入其中。

Updating/changing 你的 operator>> 是正确的做法。

挑战在于,一旦您的矩阵开始提取某些内容,您就无法再控制所使用的 istream

您可以考虑以下备选方案:

  1. 使用自己的 operator<< 重载为矩阵创建适配器。然后,您可以定制提取器的行为。但是您可能必须重写完整的提取器。它符合要求,虽然丑陋,但简单有效。
  2. 与 1 相同,但会欺骗适配器的过载,以使用中介 stringstream。然后你会输出到 stringstream 预定的 m 和 n,然后你会从 istream 读取 n x m 元素将它们输出到 stringstream 然后使用正常矩阵 operator>>stringstream 上。但是所有这一切都非常复杂,如果你有巨大的矩阵,性能会很差,并且需要三思而后行,每件事都可能出错。仅当您的矩阵元素难以解析(例如符号 CAS 表达式)时才这样做。否则转到 1 ;-)
  3. 更好的方法似乎是在您的矩阵中公开一个新成员 istream& read(&istream, size_t m, size_t n),重构它的 operator>> 以提取 m 和 n,然后转发到 read()。然后,您可以创建一个带有 operator>> 重载的适配器,该重载将使用预先确定的 m 和 n 直接调用 read()。简洁、干净、优雅。

就我个人而言,我会选择 3。