我有一个如下所示的文本文件。
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);
但这对我没有帮助,因为每行中都有不同数量的元素 我该怎么做?
答案 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);