晚上,我无法将文件读入我分配的二维数组(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;
}
#############################################################################
# ######################################################### #########
# > ########## ###### ################## #########
# ####### ##### ### ##
########### #### ##### ### ## ### ########### ####### #
########### #### ### ## ########################## #
########### ####################### ### ########################## #
########################### ### ######## ####### ### #
## # #### ### #### ############## ###### #
## ####################### #### # ############### #
## #################################################################
## #
## #
## #################################################################
########### ########## ## #### ## ###### ######## #
########### ########## #### ## ## ###### #### # ######## #
########### ################ #### ## ## ###### #### # ######## #
######## ############## #### ## ## ################ # ######## #
######## #### ## ## ################ # ######## #
#### # ################### ####### # ######## #
#### ### ####### #### ####### ################### ######## #
###### ### ####### ######### ####### ## ########### ######## #
###### ####### ############## # ## ############# ########### #
########## ################ ############# @ #
#############################################################################
################################################################################
# ############################################################ #########
# > ####### ########## ######### ################## #########
# ####### ##### ##### ### #
## ######## #### ##### ### ##### ### ########### ####### #
## ######## #### ### ##### ### ######################### #
## ######## ########## ### ##### ### ######################### #
## ######################## ### ####### ### ####### ### #
## ######################### ######## ####### ############## ###### #
## ######################### #### ####### ################ ############### #
## ################ #### ########### ################ ############### #
########### ########## ## #### ########### ###### # @ ######## #
########### ########## ## #### ########### ###### ######### # ######## #
########### ########## ## #### ## ###### #### # ######## #
########### ########## #### ## ## ###### #### # ######## #
########### ################ #### ## ## ###### #### # ######## #
######## ############## #### ## ## ################ # ######## #
######## #### ## ## ################ # ######## #
#### # ################### ########## # ######## #
#### ### ####### #### ########## ################### ######## #
###### ### ####### ######### ########## ## ########### ######## #
###### ####### ############## # ## ############# ########### #
################# ################### ############# ########### #
################# ########################################### #
################################################################################