【问题标题】:Reading a grid from a text file and storing it within a two-dimensional array?从文本文件中读取网格并将其存储在二维数组中?
【发布时间】:2015-04-16 09:32:21
【问题描述】:

假设您有一个名为“input.txt”的文件,如下所示:

5
0 0 0 0 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 0 0 
0 0 0 0 0 

上面有一个 5 x 5 的网格。您想将 5 x 5 网格存储到二维 C 数组中。我的问题是将文件读入该网格。

这是我的 C 文件,它读取数据,将其存储在二维 整数 数组中并输出其内容

int main (int argc){

    FILE *fp;
    char ch;
    int **C; //Our 2D Array
    char filenamein[] = "input.txt";

    fp = fopen(filenamein,"r"); 

    N = (ch = fgetc(fp)) - 48; 

    //Initialize Grid, set all cells to 0
    C = malloc(N * sizeof(int *));
      for (i = 0; i < N; i++) {
             C[i] = malloc(N * sizeof(int));
      }
    for (i=0;i<N;i++) {
     for (j=0;j<N;j++) {
       C[i][j]=0;
     }
    }

   //Read array, store into array
    while ((ch = fgetc(fp) ) != EOF)
    {
    for (i=0;i<N;i++){
        for (j=0;j<N;j++){
        C[i][j] = ch - 48;
        }
    }
    }

    //Print 2D Array:

     for (i = 0; i < N; i++) {
             for (j = 0; j < N; j++)
               printf("%d ", C[i][j]);
             printf("\n");
           }

fclose(fp);
}

调用这个我得到:

-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38

网格从我扣除的内容中输出 Whitespace/NULL 的 char-to-decimal ASCII 代码,因此我的问题是将文本文件读入数组。

如何读取文本文件以将数字存储到数组中?

【问题讨论】:

  • 你为什么使用 fgetc 而不是 fscanf ?当您使用 fgetc 时,您会读取空白字符,因此您需要在网格构建部分忽略它们。
  • 使用fgetc() 并将ASCII 值转换为数字几乎没有什么好处。磁盘访问是这里的瓶颈,而不是字符转换。只需使用scanf() 将数据输入为十进制数。 (另外,fgetc() 返回一个整数,所以while ((ch = fgetc(fp) ) != EOF) 可能会发生灾难性的失败。)
  • 你的网格初始化部分也有一个错误,你每次都用新的读取字符填充你的所有网格。
  • 不要堆积,而是当你减去一个 ASCII 值时,让编译器完成工作。 C[i][j] = ch - 48; 应该是 C[i][j] = ch - '0';
  • @ParhamAlvani 如果我将 fgetc 与 'fscanf(ch,"%d")' 交换并将 ch 更改为整数,然后删除 (-48) 我什么也得不到输出

标签: c c89


【解决方案1】:

此代码按预期工作。最好使用fscanf 而不是fgetc,但我没有在您的代码中更正这一点。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    FILE *fp;
    unsigned char ch;
    int **C; //Our 2D Array
    int N, i, j;
    char filenamein[] = "input.txt";

    fp = fopen(filenamein,"r");

    N = (ch = fgetc(fp)) - 48;

    //Initialize Grid, set all cells to 0
    C = malloc(N * sizeof(int *));
    for (i = 0; i < N; i++)
        C[i] = malloc(N * sizeof(int));

    for (i = 0; i < N; i++)
        for (j = 0; j < N; j++)
            C[i][j] = 0;

    i = 0;
    j = 0;
    do {
        ch = fgetc(fp);
        if (ch != ' ' && ch != '\n') {
            C[i][j] = ch - 48;
            j++;
            i += j / N;
            j %= N;
        }
    } while(i < N && j < N);

    //Print 2D Array:
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf("%d ", C[i][j]);
        printf("\n");
    }
    fclose(fp);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多