Получение данных из файла. Формирование массива(целочисленный тип) из строки, в которой присутствуют разделители

Уважаемые Форумчане. Прошу сильно тапками не кидайте, облазил как форум, так и прочие источники информации, но информации, пригодной для моего понимания так и не нашел. Пишу курсовую работу по поиску определителя матрицы с использованием классов. Вот в одном месте затык случился, не понимаю как реализовать блок работы с файлом. Логика задуманного следующая: Есть файл, в нем лежат значения, предположим через пробел, эти значения и будут является значением элементов матриц. То есть в файле: 11 12 13 14 соответственно M[0][0] = 11, M[0][1] = 12, M[1][0] = 13, M[1][1] = 14, но как это реализовать? В этом куске получаю значение строк в файле, а соответственно строк в массиве для дальнейшего динамического выделения памяти. А вот как то же самое по колонкам сделать вот ума не приложу. Помогите, люди добрые. Заранее всем благодарен.

        ifstream matrix;
        matrix.open(path, ios::app);
        ROWS=1;
        COLS=1;
        if (!matrix)
        {
            cout << "Файл не может быть открыт!\n";
        }
        else
        {
            matrix >> str;
            while (true)
            {
                getline(matrix, str);
                if (!matrix.eof())
                    ROWS++;
                else
                    break;
            }
            return arr;

            matrix.close(); 

На всякий случай прикладываю весь код

#include <iostream>
#include <time.h>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
class Array
{
public:
    int get_params()
    {
        cout << "Введите количество столбцов матрицы=";
        cin >> ROWS;
        cout << "Введите количество строк матрицы=";
        cin >> COLS;
        return 0;
    }

    int** memory_allocate_array()
    {
        arr = new int* [ROWS];
        for (int i = 0; i < ROWS; i++)
        {
            arr[i] = new int[COLS];
        }
        return arr;
    }
    int** put_array_random()
    {
        for (int row = 0; row < ROWS; row++)
        {
            for (int col = 0; col < COLS; col++)
            {
                arr[row][col] = rand() % 2;
            }

        }
        return arr;
    }
    int** put_array_user()
    {
        for (int row = 0; row < ROWS; row++)
        {
            for (int col = 0; col < COLS; col++)
            {
                cout << "Введите arr[" << row << "][" << col << "]=";
                cin >> arr[row][col];
            }

        }
        return arr;
    }
    int output_array()
    {
        for (int row = 0; row < ROWS; row++)
        {
            for (int col = 0; col < COLS; col++)
            {
                cout << "arr[" << row << "][" << col << "]=" << arr[row][col] << endl;
            }
        }
        return 0;
    }
    int** work_with_file()
    {
        ifstream matrix;
        matrix.open(path, ios::app);

        if (!matrix)
        {
            cout << "Файл не может быть открыт!\n";
        }
        else
        {
            matrix >> str;
            
            while (true)
            {
                getline(matrix, str);
                if (!matrix.eof())
                    ROWS++;
                else
                    break;
            }
            cout << "ROWS= " << ROWS << "COLS= " << COLS;
            return arr;

            matrix.close(); // закрываем файл
        }

    }
private:
    int** arr = NULL;
    int ROWS = 0;
    int COLS = 0;
    string str;
    string path = "matrix.txt";
    /*
    *
    *   Подумать как реализовать деструктор, нужен доступ к arr, который является закрытым членом класса
    *
    *
    *       ~Array()
    *       {
    *           for (int col = 0; col < COLS; col++)
    *           {
    *               delete[]arr[col];
    *           }
    *           delete[]arr;
    *           cout << "Деструктор класса отработал" << endl;
    *
    *       }
    */

};
int main()
{
    setlocale(0, "Rus");
    srand(time(NULL));
    int var;
    Array array;
    cout << "Введите каким способом вы хотите заполнить матрицу" << endl << "1. Рандомно" << endl << "2. Самостоятельно" << endl << "3. Из файла" << endl;
    cin >> var;
    switch (var)
    {
    case 1:
    {
        cout << "Вы выбрали рандомное заполнение матрицы" << endl;
        array.get_params();
        array.memory_allocate_array();
        array.put_array_random();
    }
    break;
    case 2:
    {
        cout << "Вы выбрали самостоятельное заполнение матрицы" << endl;
        array.get_params();
        array.memory_allocate_array();
        array.put_array_user();
    }
    break;
    case 3:
    {
        cout << "Укажите путь к файлу" << endl;
        array.work_with_file();
    }
    break;
    default:
    {
        cout << "Ты че, пес, тупой что ли?";
    }
    }
    array.output_array();
    return 0;
}


Ответы (1 шт):

Автор решения: Harry

Проще всего получить количество чисел в строке примерно так:

int values_count(const string& str)
{
    istringstream is(str);
    int val = 0;
    double x;
    while(is >> x) val++;
    return val;
}

Только не забудьте сравнить значения для всех строк.

Еще — не вижу смысла в том, что у вас

string str;
string path = "matrix.txt";

являются членами класса. Зачем?...

→ Ссылка