将数据追加到istream

问题描述 投票:-1回答:2

我正在从ifstream读取数据。我有一个对象,它的运算符>>读取一个整数n,一个整数m,然后读取n行m个整数(矩阵)。

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

我不想更改我的运算符>>。另外,我不会在文件中的每个矩阵之前添加行数和列数,因为它们是恒定的。

所以有一种方法可以将这两个整数附加到我的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

...
c++ ifstream istream
2个回答
1
投票

编号

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

更新/更改operator>>是正确的操作。


0
投票

挑战是,一旦矩阵开始提取某些东西,您将无法再控制所使用的istream

您可以想到:

  1. 为带有operator<<自身重载的Matix创建适配器对象。然后,您可以调整提取器的行为。但是您可能必须重写完整的提取程序。它符合要求,坚固耐用,但简单有效。
  2. 您可以欺骗适配器的重载,以使用中介stringstream。然后,您将把预定的m和n输出到stringstream,然后从istream中读取n x m个元素,将它们输出到istringstream,然后使用operator>>上的普通矩阵istringstream进行调用。但是,所有这些都是非常复杂的,如果您有庞大的矩阵,则性能不佳,并且需要三思而行。仅当您的矩阵元素难以解析(例如,符号CAS表达式)时,才执行此操作。否则转到1 ;-)
  3. [一种更好的方法似乎是在矩阵中公开一个新成员istream& read(&istream, size_t m, size_t n),重构其operator>>以提取m和n,然后转发到read()。然后,您可以创建一个带有oprator>>覆盖的适配器,该适配器将使用预定的m和n直接调用read()

我个人选择3。

© www.soinside.com 2019 - 2024. All rights reserved.