C ++-将数字表从文件读入2D数组(仅存储最后一行)

时间:2019-01-22 19:58:54

标签: c++ arrays multidimensional-array

从如下所示的输入文件开始:

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。这种行为不是我认为其他语言应该起作用的方式。

2 个答案:

答案 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中所做的那样)。在这种情况下,编译器可以更轻松地向量化您的代码。

要访问组件,请使用:

  • [i*n_cols+j]:主要行(C样式)->给定的示例,

    更有效地按以下顺序循环:for i { for j ... } }

  • [j*n_rows+i]:主要列(Fortran样式)->与BlasLapack

    兼容

    for j { for i ... } }

  • 的顺序循环更有效

答案 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
    }
}