将文本文件读入C中的二维数组

时间:2015-11-07 06:21:07

标签: c arrays string multidimensional-array file-read

我有一个如下所示的文本文件。

5
2   7
3   4   2

基本上, 第1行有1个元素, 第2行有2个元素, 第3行有3个元素, ... 最多n行,包含n个元素。

我需要阅读它们,并以这种方式放入二维数组:

a[0][0] = 5
a[1][0] = 2
a[1][1] = 7
a[2][0] = 3
a[2][1] = 4
a[2][2] = 2
...

你得到漂移。

但是我只在运行时知道n(行数)。我如何将文件读入2x2阵列?

我知道如果我知道每行文本中的元素数量,并且每行的数字是相同的,我可以执行以下操作。

fa = fopen("file.txt", "r");
for(i = 0; i < n; i++) {
    fgets(str, 1000, fa);
    sscanf(str, "%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
}
fclose(fa);

但这对我没有帮助,因为每行中都有不同数量的元素 我该怎么做?

1 个答案:

答案 0 :(得分:0)

为数组分配内存,如下所示:

int** array;

array = malloc(n * sizeof(*array)); /* Assuming `n` is the number of rows */
if(!array) /* If `malloc` failed */
{
    fputs(stderr, "Error allocating memory; Bailing out!");
    exit(-1);
}

int count = 1;
for(int i = 0; i < n; i++)
{
    array[i] = malloc(count * sizeof(**array));
    if(!array[i]) /* If `malloc` failed */
    {
        for(int j = 0; j < i; j++) /* free previously allocated memory */
        {
            free(array[j]); 
        }
        free(array);

        fputs(stderr, "Error allocating memory; Bailing out!");
        exit(-1);
    }
    count++;
}

然后,使用以下方法将文件中的数据读入数组:

FILE* fp = fopen("file.txt", "r");
if(!fp)
{
   for(int i = 0; i < n; i++) /* free previously allocated memory */
   {
      free(array[i]); 
   }
   free(array);

   fputs(stderr, "Error opening 'file.txt'; Bailing out!");
   exit(-1);
}

int max = 1;

for(int i = 0; i < n; i++)
{
    for(count = 0; count < max; count++)
    {
        fscanf(fp, "%d", &array[i][count]);
    }
    max++;
}

然后打印结果:

max = 1;

for(int i = 0; i < n; i++)
{
    for(count = 0; count < max; count++)
    {
        printf("array[%d][%d] = %d", i, count, array[i][count]);
    }
    max++;
}

最后,释放分配的内存:

for(int i = 0; i < n; i++)
{
   free(array[i]); 
}
free(array);