我正在从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
...
编号
istream是输入流。这是单向数据流。您不能以其他方式将数据放入其中。
更新/更改operator>>
是正确的操作。
挑战是,一旦矩阵开始提取某些东西,您将无法再控制所使用的istream
。
您可以想到:
operator<<
自身重载的Matix创建适配器对象。然后,您可以调整提取器的行为。但是您可能必须重写完整的提取程序。它符合要求,坚固耐用,但简单有效。 stringstream
。然后,您将把预定的m和n输出到stringstream
,然后从istream
中读取n x m个元素,将它们输出到istringstream
,然后使用operator>>
上的普通矩阵istringstream
进行调用。但是,所有这些都是非常复杂的,如果您有庞大的矩阵,则性能不佳,并且需要三思而行。仅当您的矩阵元素难以解析(例如,符号CAS表达式)时,才执行此操作。否则转到1 ;-)istream& read(&istream, size_t m, size_t n)
,重构其operator>>
以提取m和n,然后转发到read()
。然后,您可以创建一个带有oprator>>
覆盖的适配器,该适配器将使用预定的m和n直接调用read()
。我个人选择3。