在C中读取两个圆柱形文件

时间:2018-04-03 00:07:39

标签: c pointers memory-management

我有两个列文件,如下所示:

9 9
1 2
3 2

我尝试使用fscanf从中读取并将int * buff作为格式。

FILE *fp = fopen(argv[1], "r");
int num_rows = 0;
int num_columns = 2;
int i = 0;
int j = 0;

int *buff = calloc(10, num_columns * sizeof(int));

我遇到的问题是我不知道该为fscanf(fp, %d %d\n, idk1, idk2)

放置什么

我想将它们放在buff内,但我不知道在哪些地方。

for(i = 0; i < num_columns; i++) {
    for(j = 0; j <= num_rows; j++){
        int line = fscanf(fp, "%d %d\n", &buff[num_columns], &buff[num_rows]);
        if(line == EOF){
            break;
        }
        if(num_rows % 10 == 0){
            num_rows += 10;
            buff = realloc(buff, num_rows * num_columns * sizeof(int));
        }
    }
}

我正在读取我认为相同位置的值,但我看不到相同的输出。

for(i = 0; i < num_rows; i++){
  for(j = 0; j < num_columns; j++){
      printf("%d", buff[i * num_columns + j]);
  }
  printf("\n");
}

我将此视为输出:

92
20
00
00
00
...
...

但它应该只是将输入文件匹配为:]

9 9
1 2
3 2

我应该在fscanf内放置什么作为稍后在memarray[i * num_columns + j];内打印相同数据的位置?

1 个答案:

答案 0 :(得分:2)

我认为你要存储的是每一行。在您的代码中fscanf(fp, "%d %d\n", &buff[num_columns], &buff[num_rows])是错误的。您应该使用索引ij的某个表达式,而不是使用num_rowsnum_columns。基本上,您在buff[num_columns]buff[num_rows]处写的价值过高。

您希望逐行读取文件,然后只能使用单循环执行此操作。循环for(j = 0; j <= num_rows; j++)并尝试使用fscanf(fp, "%d %d\n", &buff[ num_rows*num_columns ], &buff[ num_rows * num_columns + 1 ] )存储。

此外,我不知道您使用num_rows += 10;的原因,它可能会扰乱您的循环索引。如果您想为10个新行分配内存,只需在num_rows*10中提供num_rows而不是realloc(buff, num_rows * num_columns * sizeof(int))