代码之家  ›  专栏  ›  技术社区  ›  Habil Ganbarli

C将文件读入2D数组

  •  2
  • Habil Ganbarli  · 技术社区  · 8 年前

    我有一个名为input1的文件。txt,它是由数字和一些字母组成的矩阵。我正在尝试读取它并将其存储在2D数组中,这样每个charter将是一个单元格。这是我的文本文件:

    1111S11110
    0000010001
    110100010d
    t001111110
    0100000001
    0111111101
    1111111101
    00000D01T1
    0111110001
    0000E01110
    

    这是我的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    // Function for finding the array length
    int numOfLines(FILE *const mazeFile){
        int c, count;
        count = 0;
        for( ;; ){
            c = fgetc(mazeFile);
            if( c == EOF || c == '\n' )
                break;
            ++count;
        }
        return count;
    }
    
    // Main Function
    int main( int argc, char **argv )
    {
        // Opening the Matrix File
        FILE *mazeFile;
        mazeFile = fopen( "input1.txt", "r" );
        if( mazeFile == NULL )
            return 1;
        int matrixSize = numOfLines( mazeFile );
    
        // Reading text file into 2D array
        int i,j;
        char mazeArray [matrixSize][matrixSize];
    
        for(i=0;i<matrixSize;i++){
                for(j=0;j<matrixSize;j++){
                    fscanf(mazeFile,"%c", &mazeArray[i][j]);
                }
        }
    
        for(i=0;i<matrixSize;i++){
            for(j=0;j<matrixSize;j++){
                printf("%c",mazeArray[i][j]);
            }
        }
    
        fclose( mazeFile );
        return 0;
    }
    

    然而,当我打印它们时,我的控制台输出是这样的:

    0000010001
    110100010d
    t001111110
    0100000001
    0111111101
    1111111101
    00000D01T1
    0111110001
    0000E01110@
    

    看起来它没有读到第1行,但是在索引方面,我认为它还可以。我是C的新手。谁能帮我一下吗。提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jabberwocky    8 年前

    这里有几个问题:

    这个 numOfLines 功能错误。这是正确的版本;它实际上统计行数并将文件指针重置为文件的开头。

    您的版本只计算第一行中的字符数(正好是10,因此该值似乎正确),并且没有将文件指针重置为文件的开头(因此输出中缺少第一行)。

    int numOfLines(FILE *mazeFile) {  // no const here BTW !!
      int c, count;
      count = 0;
      for (;; ) {
        c = fgetc(mazeFile);
        if (c == EOF)
          break;          // enf of file => we quit
    
        if (c == '\n')
          ++count;        // end of line => increment line counter
      }
      rewind(mazeFile);
    
      return count+1;
    }
    

    然后你忘了成为 \n 每行末尾的字符。这 \n

      for (i = 0; i<matrixSize; i++) {
        for (j = 0; j<matrixSize; j++) {
          fscanf(mazeFile, "%c", &mazeArray[i][j]);
        }
    
        char eol;                         // dummy variable
        fscanf(mazeFile, "%c", &eol);     // read \n character
      }
    

    最后你需要打印 \n

    for (i = 0; i<matrixSize; i++) {
      for (j = 0; j<matrixSize; j++) {
        printf("%c", mazeArray[i][j]);
      }
    
      putc('\n', stdout);                 // print \n
    }