如何将数据文件输入到2D阵列中

时间:2011-11-23 17:23:04

标签: c file-io

我有一个文件,我需要存储在二维数组中,所以我可以对它执行矩阵运算。我所知道的是,双打将用空格和换行符分隔,例如:

2.04 3.0 4.0
5.0 6.1 7.0
8.0 9.03 10.0

我不知道会有多少个数字,所以我需要一个可扩展的解析功能。到目前为止,我有:

int main(int argc, char* argv[])
{
    FILE *fp;
    char ch;
    fp = fopen("matrix.dat","r");
    if ( fp == NULL )
    {
        puts ( "Cannot open source file");
    }

    /*count the number of lines*/
    int lines=1;
    char c;
    while((c = fgetc(fp)) != EOF)
    {
        if(c == '\n')
            lines++;
    }
    printf("lines= %i\n",lines);

    /*reopen the file to reset the pointer*/
    fclose(fp);
    fp = fopen("matrix.dat","r");
    double m[lines][lines];

    /*Load file into array*/
    int i,j;
    for(i=0;i<lines;i++)
    {
        for(j=0;j<lines;j++)
        {
            fscanf( fp, "%lf", &(m[i][j]));
        }
        fscanf(fp, "\n", NULL);
    }

    /*print out stored matrix*/
    for(i=0;i<lines;i++)
    {
        for(j=0;j<lines;j++)
        {
            printf("%lf ",m[i][j]);
        }
        printf("\n");
    }
}

我对此方法的问题是

  1. 假设行数等于每行的双精度数,这可能不是真的。**

  2. 文件中任何缺少的双打都会导致程序将错误的矩阵加载到内存中(剩余值偏移1)。

  3. 我目前正在将文件加载到内存中两次以计算行数。

  4. 有没有更合理的方法将这些数据输入2D数组?我需要确保输入矩阵是正方形的,并且我的程序可以处理任何顺序的方阵。我对C很陌生,因此非常感谢示例和命名功能:)(对于狡猾的缩进道歉)

    **抱歉这么模糊,我想要一些错误处理,即确保输入不被接受,除非确实有nxn双打。

2 个答案:

答案 0 :(得分:4)

像尼古拉斯一样,我很好奇你的意思是点(1)......如果矩阵是正方形,那么行数总是不等于每行的双倍数?如果没有,那么我想你可以通过文件查看具有最多值的行。

以下是您修改的代码:

/* count the number of lines */
int lines = 1;
int maxValues = 0;
int count = 0;
char junk;
while((junk == fgetc(fp)) != EOF) {
    if(junk == '\n') {
        lines++
        if(maxValues <= count) {
            maxValues = ++count;
        }
        count = 0;
    }
    else if(junk == 0x20) {
        count++;
    }
}

要解决第(2)点,可以尝试这种修改:

/* load file into array */
int i, j;
for(i = 0; i < lines; i++) {
    j = 0;
    do {
        fscanf(fp, "%lf", &(m[i][j]));
        j++;
    } while((junk = fgetc(fp)) != '\n');
}

最后对于第(3)点,我很确定你可以使用rewind(fp);将指针重置为文件的开头。

答案 1 :(得分:0)

  • 使用fgets
  • 阅读第一行
  • 计算值,假设它们是n
  • 制作一个n * n
  • 数组
  • 读取每个n - 1n行的{{1}}行
  • 计算逆

瞧!