c++ 阅读二维数组中的文件

cgfeq70w  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(178)

我尝试在此函数中读取2D数组中csv文件的数据,但打印数组时输出为零,问题是什么?文件有5行和500列

void readFilesToReadings() {
int row = 5;
int col = 10;

int myArray[row][col];
string fileName, BasefileName = "C:/Users/hhh/Desktop/frac/Z500.csv"
//Opening the file
ifstream inputfile(fileName);

if (!inputfile.is_open()) 
cout<<"Error opening file" ;

//Defining the loop for getting input from the file

for (int r = 0; r < row; r++) //Outer loop for rows
{
    for (int c = 0; c < col; c++) //inner loop for columns
    {
      inputfile >> myArray[r][c];  //Take input from file and put into myArray
    }
}

for (int r = 0; r < row; r++)
{
    for (int c = 0; c < col; c++)
    {
        cout << myArray[r][c] << "\t";
    }
    cout<<endl;
}

}

Update1:这是user20716902答案的输出

scyqe7ek

scyqe7ek1#

这里是固定的代码,你只是设置BasefileName(这是从来没有使用,fileName没有设置,所以当然你的文件打开失败。(我已经测试了我自己的csv和他们现在的工作):

void readFilesToReadings() {
   const int row = 5;
   const int col = 10;

   int myArray[row][col];
   string fileName = "C:/Users/hhh/Desktop/frac/Z500.csv";
   
   //Opening the file
   ifstream inputfile(fileName);

   if (!inputfile.is_open())
   {
      cout << "Error opening file";
   }
   else {

      //Defining the loop for getting input from the file

      for (int r = 0; r < row; r++) //Outer loop for rows
      {
          for (int c = 0; c < col; c++) //inner loop for columns
          {
             inputfile >> myArray[r][c];  //Take input from file and put into myArray
          }
      }

      for (int r = 0; r < row; r++)
      {
          for (int c = 0; c < col; c++)
          {
              cout << myArray[r][c] << "\t";
          }
          cout << endl;
      }
   }

}

xqkwcwgp

xqkwcwgp2#

在C++中,从文件中阅读内容并不难,但有一个模式是你必须遵循的。最简单的方法是为自己创建一个小函数来实现这个模式。

#include <fstream>
#include <iostream>
#include <string>

template <typename T, size_t ROWS, size_t COLUMNS>
bool load_readings_from_file( 
    const std::string & filename, 
    T (&array)[ROWS][COLUMNS], 
    char delimiter = ',' )
{
    std::ifstream f( filename );
    for (size_t row = 0;  row < ROWS;  row++)
    {
        for (size_t column = 0;  column < COLUMNS;  column++)
        {
            f >> std::ws;
            if (f.peek() == delimiter) f.get();
            f >> array[row][column];
        }
    }
    return (bool)f;
}

我使用了模板,这样您就可以向它传递任何大小的数组,但是如果需要,您可以很容易地在全局名称空间中硬编码数组类型(大小)。

using ReadingsArrayType = int[5][10];

bool load_readings_from_file(
    const std::string & filename,
    ReadingsArrayType array,
    char delimiter = ',' )
{
    ...
}

无论哪种方式,使用它从文件填充数组都非常简单:

int main()
{
    constexpr int rows = 5;
    constexpr int cols = 10;
    
    int myReadingsArray[rows][cols];
    
    if (!load_readings_from_file( "C:/Users/hhh/Desktop/frac/Z500.csv", myReadingsArray ))
    {
        std::cerr << "Could not load file!\n";
        return 1;
    }
    
    // Print the matrix
    for (int r = 0;  r < rows;  r++)
    {
        for (int c = 0;  c < cols;  c++)
        {
            std::cout << myReadingsArray[r][c] << "\t";
        }
        std::cout << "\n";
    }
}

(同样,如果直接使用数组类型:

int main()
{
    ReadingsArrayType myReadingsArray;

    if (!load_readings_from_file( ... )) ...

正如您所看到的,myReadingsArray实际上是一个数组,这一点就不那么清楚了......所以我个人倾向于避免这种类型别名。)
最后,你应该避免使用绝对路径作为你的文件名。把数据和你的可执行文件放在同一个目录,或者它的一个子目录。更好的是,让用户提供一个文件名:

int main( int argc, char ** argv )
{
    if (argc != 2)
    {
        std::cerr << "usage:\n  myprog FILENAME\n";
        return 1;
    }

    const char * filename = argv[1];

    int myReadingsArray[5][10];

    if (!load_readings_from_file( filename, myReadingsArray )) ...

创建函数来做一些事情,离应用C++的全部功能来为你序列化对象只有一步之遥,稍后你会了解到这一点。

相关问题