我正在编写一个程序,用于从txt文件中读取一些数字,并用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;
}
答案 0 :(得分: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
跟踪大小。不要创建新的
每次在内循环中矢量。并且只创建一个嵌套
一个(你推回的那个)在外循环中。
答案 1 :(得分:0)
在第二个for循环中,你应该检查mat [j]而不是第一个元素。
for (int k=0; k < mat[j].size(); k++)