Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        在11个月前关闭。
                                                                                            
                
        
从如下所示的输入文件开始:

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。我不认为这种行为应该来自其他语言。

最佳答案

您必须置换以下几行:

 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 ... } }

关于c++ - C++-将数字表从文件读入2D数组(仅存储最后一行),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54315593/

10-11 18:44