Я пишу программу для чтения некоторых чисел из текстовых файлов и сохранения их в матрицах с помощью C ++. Но я не настолько знаком с концепцией матрицы и немного запутался. Когда я пытаюсь запустить программу, я получаю векторную подписку из-за ошибки диапазона, и я не знаю, что делать, если кто-то посмотрит на мой код и покажет мне правильный путь, это было бы здорово.
Вот мой код
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include "strutils.h"#include <iomanip>
using namespace std;
void Print(const vector<vector<int>> & mat)
{
for (int j=0; j < mat.size(); j++)
{
for (int k=0; k < mat[0].size(); k++)
{
cout << mat[j][k];
}
cout << endl;
}
}int main()
{
string filename;
int countRow = 0, countCol = 0, emptyCount = 0;
cout << "Please enter the input file name: ";
cin >> filename;
ifstream input;
input.open(filename);
while(input.fail())
{
cout<< "Could not open the file please enter the correct file name:";
cin >> filename ;
input.open(filename);
}
while(!input.eof())
{
string s;
int num;
while (getline(input, s))
{
countRow++;
vector<vector<int>> mat(countRow, vector<int>(countCol));
istringstream input(s);
while (input >> num)
{
countCol++;
emptyCount++;
vector <int> row(countCol);
mat.push_back(row);
mat [(countRow - 1)] [(countCol - 1)] = num;
}
countCol = 0;
}}
vector<vector<int>> mat(countRow, vector<int>(emptyCount/countRow));
Print(mat);
cin.get();
cin.ignore();
return 0;
}
Я не знаю с чего начать. Вы создаете много временных
векторы, которые вы никогда не используете; тогда вы выводите вектор
построен без каких-либо данных, которые вы читаете. Ты считаешь
строки и линии, хотя сами векторы будут делать это
для тебя. И, как указывает @Nick, у вас есть mat[countRow
где
- 1][countCol - 1]countCol
гарантированно будет больше
чем вектор, в который он индексируется. Что не так с
следующее для вашего цикла чтения:
std::vector<std::vector<int>> mat;
std::string line;
while ( std::getline( input, line ) ) {
mat.push_back( std::vector<int>() );
std::istringstream input( line ):
int num;
while ( input >> num ) {
mat.back().push_back( num );
}
}
Позволять std::vector
следить за размером. Не создавайте новый
вектор каждый раз во внутреннем цикле. И только создать вложенный
один (тот, который вы отталкиваете) во внешнем цикле.
Во втором цикле for вы должны проверить соответствие mat [j] и не всегда первый элемент.
for (int k=0; k < mat[j].size(); k++)