从如下所示的输入文件开始:
2 3
2 3 4
4 3 2
我正在尝试将此数据读取到C ++中的2D数组中(第一行指定行数/列数)。
我的代码当前如下所示:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream fin;
fin.open ("dataset.in");
// a matrix
int a_numrows;
int a_numcols;
int a[a_numrows][a_numcols];
fin >> a_numrows >> a_numcols;
cout << a_numrows << " " << a_numcols << endl;
for (int i = 0; i<a_numrows; i++)
{
for (int j = 0; j<a_numcols; j++)
{
fin >> a[i][j];
}
}
cout << a[0][0] << endl;
fin.close();
return 0;
}
但是,似乎在2D数组的每一行中,都存储着最后一行。因此,当输出a[0][0]
时,它将返回4
。这种行为不是我认为其他语言应该起作用的方式。
答案 0 :(得分:3)
您必须对这些行进行置换:
int a[a_numrows][a_numcols];
fin >> a_numrows >> a_numcols;
到
fin >> a_numrows >> a_numcols;
int a[a_numrows][a_numcols];
我想这是疏忽大意的错误。
也就是说,有更安全/更好的方法来声明/使用2D数组。这是一个可能的示例:
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::ifstream fin("dataset.in");
size_t n_rows, n_cols;
fin >> n_rows >> n_cols;
using T = int;
std::vector<T> array(n_rows * n_cols);
array.assign(std::istream_iterator<T>(fin), std::istream_iterator<T>());
fin.close();
//-----
for (size_t i = 0; i < n_rows; i++)
{
for (size_t j = 0; j < n_cols; j++)
{
std::cout << array[i * n_cols + j] << "\t";
}
std::cout << endl;
}
return 0;
}
输出:
g++ reader.cpp; ./a.out
2 3 4
4 3 2
记住,在进行数值计算时,通常最好将所有数字存储到连续的内存块中(就像在std::vector
中所做的那样)。在这种情况下,编译器可以更轻松地向量化您的代码。
要访问组件,请使用:
答案 1 :(得分:0)
要在C ++中声明一个数组,必须在编译时知道其大小。即您不能将a_numrows和a_numcols作为数组维度传递,因为它们是运行时值。对于这种方法,我将使用std :: vector:
vector<vector<int>> a;
//... read a_numrows and a_numcols
a.resize(a_numrows); //resize creates #a_numrows empty columns
for(int i = 0; i < a_numrows; ++i)
{
for(int j = 0; j < a_numcols; ++j)
{
int value; fin >> value;
a[i].push_back(value); //access the ith row and add a new column with value inside
}
}