Получение данных из файла. Формирование массива(целочисленный тип) из строки, в которой присутствуют разделители
Уважаемые Форумчане. Прошу сильно тапками не кидайте, облазил как форум, так и прочие источники информации, но информации, пригодной для моего понимания так и не нашел. Пишу курсовую работу по поиску определителя матрицы с использованием классов. Вот в одном месте затык случился, не понимаю как реализовать блок работы с файлом. Логика задуманного следующая: Есть файл, в нем лежат значения, предположим через пробел, эти значения и будут является значением элементов матриц. То есть в файле: 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 шт):
Проще всего получить количество чисел в строке примерно так:
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";
являются членами класса. Зачем?...