0

晚上,我无法将文件读入我分配的二维数组(maze[][])。二维数组根据最大行数(行数)和最大列数(具有最长数字字符的行)分配和调整大小。我正在使用 getc,但我认为它的用途非常有限,可能需要另一种方法来成功启动我的阵列。在文件中,有比 max 列更早结束的换行符,我认为这可能会导致无法将文件复制到我的数组中。如果文件大小完美,则它可以完美运行。

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

#define MAX_LINE_SIZE 256

char **get_maze_map(char *argv[], int *rows, int *columns);
char **alloc_maze(char **maze, int *rows, int *columns);
void print_maze_map(char **maze, const int *rows, const int *columns);
void destroy_maze_map(char **maze, const int *rows);

int main(int argc, char *argv[])
{
    if (argc == 2) {
        int rows = 0;
        int columns = 0;

        char **maze = get_maze_map(argv, &rows, &columns);

        print_maze_map(maze, &rows, &columns);

        destroy_maze_map(maze, &rows);


    }




    else {
        printf("\nUSAGE ERROR: ./maze [filename].txt");
        exit(-1);
    }


    return 0;
}

void print_maze_map(char **maze, const int *rows, const int *columns)
{
    int i;
    int j;
    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < *columns; ++j) {
            printf("%c", maze[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void destroy_maze_map(char **maze, const int *rows)
{
    for (int i = 0; i < *rows; ++i) {
        free(maze[i]);
    }
    free(maze);
}

char **get_maze_map(char **argv, int *rows, int *columns)
{
    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        fprintf(stderr, "\nCould not open %s", argv[1]);
        exit(-1);
    }

    char *line_buf = NULL;
    size_t line_buf_size = 0;
    int line_count = 0;
    ssize_t line_size;

    line_size = getline(&line_buf, &line_buf_size, fp);

    while (line_size >= 0)
    {
        line_count++;

        printf("line[%06d]: chars=%06zd, buf size=%06zu, contents: %s", line_count,
               line_size, line_buf_size, line_buf);

        line_size = getline(&line_buf, &line_buf_size, fp);

        if (line_size > *columns) {
            *columns = line_size;
        }
    }
    *rows = line_count;
    free(line_buf);
    line_buf = NULL;


    (*columns)--;
    printf("\nRows %d", *rows);
    printf("\nColumns %d", *columns);
    printf("\n");

    char **maze = malloc(*rows * sizeof(char*));

    for (int i = 0; i < *rows; ++i){
        maze[i] = malloc(*columns * sizeof(char*));
    }

    int a;
    int b;
    for (a = 0; a < *rows; ++a) {
        for (b = 0; b < *columns; ++b) {
            maze[a][b] = ' ';
        }
    }

    rewind(fp);

    int i;
    int j;
    char c;



    for (i = 0; i < *rows; ++i) {
        for (j = 0; j < *columns; ++j) {

            if ((c = getc(fp)) == '\n') {
                c = getc(fp);
            }

            maze[i][j] = c;
        }
    }

    fclose(fp);

    return maze;
}
#############################################################################  
#   #########################################################       #########  
# >              ##########       ######   ##################       #########  
#   #######           #####                ###                              ## 
###########      #### #####       ### ##   ###    ###########       #######  # 
###########      ####             ### ##          ########################## # 
###########      #######################   ###    ########################## # 
###########################       ### ########    #######               ###  # 
##                         # #### ### #### ##############        ######     #  
## #######################   ####                         # ############### #  
##          #################################################################  
##          #                                                                  
##          #                                                                  
##          #################################################################  
########### ##########    ## ####       ## ######                  ######## #  
########### ##########       #### ##    ## ######      #### #      ######## #  
########### ################ #### ##    ## ######      #### #      ######## #  
########      ############## #### ##    ## ################ #      ######## #  
########                     #### ##    ## ################ #      ######## #  
####   #      ################### #######                   #      ######## #  
####   ### #######           #### ####### ###################      ######## #  
###### ### ####### #########      ####### ##      ###########      ######## #  
######     ####### ##############       # ##      ############# ########### #  
##########             ################           #############    @        #  
#############################################################################  
################################################################################
#   ############################################################       #########
# > #######      ##########       #########   ##################       #########
#   #######           #####           #####   ###                              #
## ########      #### #####       ### #####   ###    ###########       ####### #
## ########      ####             ### #####   ###    ######################### #
## ########      ##########       ### #####   ###    ######################### #
## ########################       ### ####### ###    #######               ### #
## ######################### ######## ####### ##############        ######     #
## ######################### ####     ####### ################ ############### #
##          ################ #### ########### ################ ############### #
########### ##########    ## #### ########### ######           #    @ ######## #
########### ##########    ## #### ########### ###### ######### #      ######## #
########### ##########    ## ####          ## ######      #### #      ######## #
########### ##########       #### ##       ## ######      #### #      ######## #
########### ################ #### ##       ## ######      #### #      ######## #
########      ############## #### ##       ## ################ #      ######## #
########                     #### ##       ## ################ #      ######## #
####   #      ################### ##########                   #      ######## #
####   ### #######           #### ########## ###################      ######## #
###### ### ####### #########      ########## ##      ###########      ######## #
######     ####### ##############          # ##      ############# ########### #
#################      ###################           ############# ########### #
#################      ###########################################             #
################################################################################
4

1 回答 1

1

您的主要阅读循环是:

for (i = 0; i < *rows; ++i) {
    for (j = 0; j < *columns; ++j) {
        if ((c = getc(fp)) == '\n') {
            c = getc(fp);
        }
        maze[i][j] = c;
    }
}

当你提前得到一个换行符时,你应该把空格放在全宽,或者只是从下一行数据开始,而不是在当前行的末尾继续下一行的第一个字符。类似于以下内容:

for (int i = 0; i < *rows; ++i)
{
    for (int j = 0; j < *columns; ++j)
    {
        if ((c = getc(fp)) == '\n')
        {
            while (j < *columns)
                map[i][j++] = ' ';
            break;
        }
        maze[i][j] = c;
    }
    if (c != '\n')
    {
        /* This loop should execute at most once */
        while ((c = getc(fp)) != EOF && c != '\n')
            ;
    }
}

这些行应该以空值结尾吗?getc()是否应该更频繁地检查 EOF调用?

警告:未经测试的代码!

于 2021-01-29T07:54:54.513 回答