读取文件并存储在数组

时间:2016-05-08 14:23:48

标签: c arrays struct

我有一个迷宫输入文件maze.txt,如下所示:

    #.#######
    #.......#
    ####.####
    #....#..#
    #.####.##

“#”代表墙壁,“。”代表可通过的细胞。我希望能够使用输入重定向读取此文件:

    mazeprogram.exe < maze.txt

我希望能够打印出这个迷宫中有多少行和列,如下所示:

    ##..##############
    ##..............##
    ########..########
    ##........##....##
    ##..########..####

我也想坚持使用scanf(),因为我试图在c编程的基础上变得更好。

到目前为止,我无法将行和列分配给2d数组。这就是我到目前为止所做的:

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

    #define MAX_HEIGHT 100
    #define MAX_WIDTH 100
    #define wall "#"
    #define path_cell "."

    typedef struct {
        char type;
        int visited;
        int final_path;
    } mazecells_t;

    typedef struct {
        int height;
        int width;

        mazecells_t M[MAX_HEIGHT][MAX_WIDTH];

   } m_type;

   void read_maze(m_type *maze);

   int
   main(int argc, char *argv[]) {
       m_type MAZE;

       read_maze(&MAZE);

       return 0;
   }

   void 
   read_maze(m_type *maze) {
       int row=0, col=0;

       scanf("%d %d", &maze->height, &maze->width);

       for (row=0; row < maze->height; row++) {

           for(col=0; col < maze->width; col++) {
               maze -> M[row][col]; 
           }
       }
    }

我知道到目前为止我的代码不对,我只是难以将迷宫输入中的行和列分配给2d数组。我希望能够这样做,所以我可以打印列和行。如果我没有朝着正确的方向前进,那么任何让我走上正确轨道的帮助都将不胜感激。

谢谢你们:)

1 个答案:

答案 0 :(得分:1)

试试这个:

void
read_maze(m_type *maze) {
    int row=0, col=0;
    char ch;

    while(EOF != scanf("%c", &ch)){
        if(ch == wall || ch == path_cell){//#define wall '#' #define path_cell '.'
            maze->M[row][col].type = ch;
            maze->M[row][col].visited = 0;
            maze->M[row][col].final_path = 0;
            ++col;
        } else if(ch == '\n'){
            maze->width = col;//uncheck same size and max size limit
            col = 0;
            ++row;
        }
    }
    if(col != 0)
        ++row;//uncheck max size limit

    maze->height = row;

    printf("maze has %d rows and %d columns\n", maze->height, maze->width);
    for (row = 0; row < maze->height; row++) {
        for(col = 0; col < maze->width; col++) {
            putchar(maze->M[row][col].type); 
        }
        putchar('\n');
    }
}