从文件[C ++]中读取矩阵数据及其维度

时间:2016-01-30 11:11:58

标签: c++ matrix

我有一个txt文件,其结构如下:

<num Rows> <num Columns>
<M(0,0)> ... <M(0,nColumns-1)>
...
<M(nRows-1,0)> ... <M(nRows-1,nColumns-1)>

换句话说,第一行只有2个标量,即矩阵中的行数和列数。从第二行开始,矩阵体开始。

我想在C ++中导入这样的矩阵,遵循以下步骤:

  1. 在读取第一行后,使用nRows行和nColumns列预分配矩阵
  2. 通过阅读txt文件的其余部分来填充矩阵。
  3. 到目前为止,我一直在尝试以下代码:

    har line[256];
    int nRows; int nCols;
    int i; int j;
    
    bool FirstLine=true;
    while (fgets(line, sizeof(line), fileIN)) {
        if (FirstLine==true){
            char nRowsC=line[0];
            nRows=nRowsC- '0';
    
            char nColsC=line[2];
            nCols=nColsC- '0';
    
            FirstLine=false;
    
            double **myMat=(double**)malloc(nRows*sizeof(double*));
            for(i=0; i<nRows; i++){
                myMat[i]=(double*)malloc(nCols*sizeof(double));
            }
    
            printf("Number of rows in data matrix: %d\n",nRows);
            printf("Number of columns in data matrix: %d\n\n",nCols);
    
            for(i = 0; i < nRows; i++)
            {
                for(j = 0; j < nCols; j++)
                {
                    if (!fscanf(fileIN, "%lf", &myMat[i][j]))
                        break;
                    printf("(%d,%d) %lf\n",i,j,myMat[i][j]);
                }
    
            }
        }
    }
    cout << '\n'; cout << '\n'; cout << '\n';
    for(i = 0; i < nRows; i++)
    {
        for(j = 0; j < nCols; j++)
        {
            printf("(%d,%d) %lf\n",i,j,myMat[i][j]); //<-- this line gives the error
        }
    }
    

    一切似乎都没问题但如果我打印出这样的矩阵,我会收到一个错误,标识符“myMat”未声明(特别是:“使用未声明的标识符'myMat'”。编译器:Mac OS X 10.11上的XCode 7.2)。

1 个答案:

答案 0 :(得分:2)

你自己说过:myMat在...已经被关闭的范围内声明。

与Python不同,C++ has block-scoping规则:

double** myMat;
{
   int inner;
   myMat = foo(); // allowed: myMat is visible here
}
inner = 5; // compiler error: inner not visible anymore

如果你想访问这个变量,你应该在外部范围内声明,并在现在填写的地方填写它。

作为旁注,C ++正朝着我们不再在应用程序代码中分配太多的方向发展。如果将其恢复为使用std::vector

,您的代码可能会更安全,更易读
using Row = std::vector<double>;
using Matrix = std::vector<Row>;

Matrix myMat;

请参阅http://cpp.sh/4iu4上的示例。