Как прочитать матрицу из txt файла в матрицу шаблона? - PullRequest
1 голос
/ 04 мая 2019

У меня есть матрица шаблонов, и я не знаю, как читать мой текстовый файл "matrix1". Как мне определить метод "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

РЕДАКТИРОВАТЬ:

Это мойНовый код, но с этим я не могу построить решение, и я не знаю, как обработать ошибку: Возникло исключение: нарушение прав чтения.матрица this-> была 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;

}}

1 Ответ

0 голосов
/ 04 мая 2019

<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 как мнимая часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...