Ошибка при записи данных из файла в вектор класса
Всем добрый день! Во время написания кода возникла проблема с тем, что когда программа доходит до момента заполнения вектора данными из файла, вылетает ошибка, и программа прекращает работу.
Суть программы заключается в считывании двух матриц и их последующем перемножении. И если с записью матриц в файл и их перемножением вопросов нет, то вот со считыванием я зашёл в тупик.
По задумке, я собирался перегрузить оператор >>
, после чего, так как у нас матрица, можно спокойно найти количество строк и колонок в файле, и затем использовать все известные нам данные и спокойно заполнить вектор, но как можно догадаться, всё пошло по одному месту.
Изначально я думал, что проблема может быть в том, что мы находимся в конце файла, и программа просто не знает, что записывать, но нет. Позже я подумал, что данные в файле хранятся в формате char
, а я пытаюсь их записать в формате int
, но и тут неудача.
В общем, я зашёл в тупик, поэтому хотел бы попросить помощи. Пример кода:
friend std::ifstream& operator >> (std::ifstream& is, Matrix& matrix)
{
int row = 0, column = 0;
std::string line;
while (getline(is, line))
{
if (row == 0)
{
for (int i = 0; i < line.size(); i++)
{
if (line[i] != ' ')
column++;
}
}
row++;
}
matrix.COLUMN = column;
matrix.ROW = row - 1;
is.seekg(0);
for (int i = 0; i < matrix.ROW; i++)
{
matrix.MATRIX_VALUES.push_back(std::vector<int>());
for (int j = 0; j < matrix.COLUMN; j++)
{
is >> matrix.MATRIX_VALUES[i][j];
}
}
return is;
}
Ответы (1 шт):
Проблему удалось решить при помощи библиотеки sstream
— теперь можно записывать в матрицы не только цифры, но и числа, так как каждое значение в строке считывается до пробела:
int row = 0, column = 0;
std::string line;
while (getline(is, line))
{
if (line == "")
break;
std::vector<int> data;
std::stringstream sstream(line);
while (sstream) {
int value;
sstream >> value;
sstream.ignore(1);
data.push_back(value);
}
if (row == 0)
{
for (int i = 0; i < line.size(); i++)
{
if (line[i] == ' ')
column++;
}
}
//std::cout << data[0] << "\n" << data[1] << "\n";
row++;
matrix.MATRIX_VALUES.push_back(data);
}
matrix.COLUMN = column + 1;
matrix.ROW = row;
return is;