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