在C中将文件读取到2D数组

我正在学习C,我决定将文字游戏作为我的学习项目 。 所以我正在尝试这种将文本文件读入2D数组的原始“解析器”,但是存在一个问题:这个地图不使用1个字符宽的单元格,它使用2个字符宽的单元格。 例如,播放**表示,门用##表示,依此类推。

这意味着,我需要读取文本文件的2个字符,然后将其分配给地图中的相应单元格。

好吧,我制作了一个包含的测试文件

 aabbccddee ffgghhiijj kkllmmnnoo ppqqrrsstt uuvvwwxxyy 

我试着用它读

 #include  #define ROWS 5 #define COLS 5 int main() { FILE *mapfile = fopen("durr", "r"); char charbuffer[3], row, col, *map[ROWS][COLS]; /* Initializing array */ for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { map[row][col] = " "; } } /* Reading file into array */ for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { map[row][col] = fgets(charbuffer, 3, mapfile); } } /* Printing array */ for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { printf("%s", map[row][col]); } printf("\n"); } fclose(mapfile); return 0; } 

但是当我执行它时,我得到了这个

 uuuuuuuuuu uuuuuuuuuu uuuuuuuuuu uuuuuuuuuu uuuuuuuuuu 

我认为它与fgets返回指针的事实有关,但我不确定。 我尝试用fgetc做它,但它看起来很乱,我在阅读了关于获取后放弃了它。

你应该删除从文件中读取的内容。 用以下内容替换文件读取块:

 /* Reading file into array */ for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { if (fgets(charbuffer, 3, mapfile)) map[row][col] = strdup(charbuffer); } } 

并且不要忘记将它放在代码的开头:

 #include  

主要问题是

 char *map[ROWS][COLS]; 

只为ROWS x COLS char 指针分配空间,它不为字符串本身分配空间。 所以你在每次迭代时都会不断覆盖charbuffer,这就解释了为什么你在读出时会反复重复使用相同的字符。 您需要根据需要动态分配所需的内存

 for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { charbuffer = (char*)malloc(sizeof(char) * 3); //**** map[row][col] = fgets(charbuffer, 3, mapfile); } }