我有一个模板矩阵,但我不知道如何读取我的“ matrix1” txt文件。如何定义“ open1”方法?这是我的课程和我的文件。 在文件中,前两个数字是矩阵的行和列。
template <class T = double>
class Matrix
{
private:
unsigned row;
unsigned column;
T ** matrix;
template<class OUTP>
friend std::ostream& operator<<(std::ostream&, const Matrix<OUTP>&);
template<class INP>
friend std::istream& operator>>(std::istream&, Matrix<INP>&);
public:
Matrix(unsigned = 0, unsigned = 0);
~Matrix();
Matrix(const Matrix & other);
void setMatrixElement(unsigned, unsigned, T);
void delMatrix();
T getElement(unsigned = 0, unsigned = 0);
unsigned getRow()const { return row; }
unsigned getColumn()const { return column; }
bool open1();
};
这是我的文件
3 3
26.062000 16.600000 24.900000 49.800000 0.000000 1.000000 2.000000
4.000000 5.000000
编辑:
这是我的新代码,但与此有关,我无法构建解决方案,而且我不知道如何处理错误:抛出异常:读取访问冲突。 此->矩阵为0x1110112。”
template <class T>
bool Matrix<T> ::open1()
{
ifstream myfile("matrix1.txt");
if (!myfile)
{
cout << "Error with fileopening" << endl;
return false;
}
myfile >> row;
myfile >> column;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; i++)
{
myfile >> matrix[i][j];
}
}
myfile.close();
return true;
}}
答案 0 :(得分:0)
<fstream>
将成为您的朋友:
您无需使用文件指针,而只需使用流:
ifstream ifs("matrix1.txt"); // istream is "r"
您可以检查流是否有问题
if (!ifs) {
// .. ouch
}
读取数据就像
ifs >> row >> column;
或
ifs >> M.matrix[j][g];
C ++会推断您要读取的数据类型,因此您无需使用"%d"
中所需的容易发生手动错误的"%lf"
或scanf()
。
此外,它的功能要强大得多,因为如果使用T
而非double
实例化矩阵,它将始终调用流提取器的正确重载。例如,使用Matrix<std::complex<double>>
,您可以使用相同的模板代码读取文件,例如:
2 2
(1.0,1.0) 2.0
(2.5,4) (2.0,1.0)
其中(2.0,1.0)
是一个复数的标准表示,其中2.0为实部,而1.0为虚部。