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

在C语言中将文件读取到2D数组,c,parsing,file-io,multidimensional-array,C,Parsing,File Io,Multidimensional Array,我正在学习C,我决定做一个文本游戏作为我的学习项目。所以我正在尝试这个基本的“解析器”,它将文本文件读入2D数组,但有一个问题:这个映射不使用1个字符宽的单元格,它使用2个字符宽的单元格。例如,播放器用**表示,门用表示,等等 这意味着,我需要读取文本文件的2个字符,然后将其分配给映射中的相应单元格 我制作了一个包含 aabbccddee ffgghhiijj kkllmmnnoo ppqqrrsstt uuvvwwxxyy 我试着用英语读它 #include <stdio.h>

我正在学习C,我决定做一个文本游戏作为我的学习项目。所以我正在尝试这个基本的“解析器”,它将文本文件读入2D数组,但有一个问题:这个映射不使用1个字符宽的单元格,它使用2个字符宽的单元格。例如,播放器用
**
表示,门用
表示,等等

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

我制作了一个包含

aabbccddee
ffgghhiijj
kkllmmnnoo
ppqqrrsstt
uuvvwwxxyy
我试着用英语读它

#include <stdio.h>

#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;
}

我认为这与FGET返回指针这一事实有关,但我不确定。我试着用fgetc来做,但它看起来很凌乱,在读了gets之后我把它扔了。

主要的问题是

char *map[ROWS][COLS];
只为行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);
    }
}
for(行=0;行<行;行++){
for(col=0;col
主要问题是

char *map[ROWS][COLS];
只为行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);
    }
}
for(行=0;行<行;行++){
for(col=0;col
您应该已经备份了从文件中读取的内容。将文件读取块替换为以下内容:

/* 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);
    }
}
/*将文件读入数组*/
对于(行=0;行<行;行++){
for(col=0;col
别忘了在代码的开头也写上:

#include <string.h>
#包括

您应该已经备份了从文件中读取的内容。将文件读取块替换为以下内容:

/* 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);
    }
}
/*将文件读入数组*/
对于(行=0;行<行;行++){
for(col=0;col
别忘了在代码的开头也写上:

#include <string.h>
#包括

C中没有字符串,只有字符数组。因此,您不能指定“字符串”!相反,请使用strncpy()
,并确保您了解所涉及的内存管理。C中没有字符串,只有字符数组。因此,您不能指定“字符串”!相反,请使用
strncpy()
,并确保您了解所涉及的内存管理。嗯,我得到了内置函数“malloc”的不兼容隐式声明
。也许我错过了什么?可能是我的gcc吗?哦,我不得不将charbuffer[3]改为*charbuffer,否则我会在从类型“char*”分配给类型“char[3]时得到一个不兼容的类型。
错误。@user1002327关于charbuffer[3]->charbuffer*,忘了提到这一点。至于malloc,尝试包含“stdlib.h”。嗯,我得到了内置函数“malloc”的不兼容隐式声明。
。也许我错过了什么?可能是我的gcc吗?哦,我不得不将charbuffer[3]改为*charbuffer,否则我会在从类型“char*”分配给类型“char[3]时得到一个不兼容的类型。错误。@user1002327关于charbuffer[3]->charbuffer*,忘了提到这一点。至于malloc,尝试包括“stdlib.h”。我想这就是我想要的。我一直在寻找一种(以某种方式)取消对FGET返回值的引用的方法,但是是的,这就是我一直在寻找的。现在可以用了,格式都很奇怪。这样地。可能是我做错了什么吗?如果想法是学习C,那么他应该习惯malloc,而不是调用一个甚至不属于标准的函数。我会说,这是因为数组的大小。别忘了,
fgets
不仅读取,而且将EOF放入缓冲区。@mattfillips我同意你的说法。但我还要提醒你,POSIX是一个有效的标准。哦,马特和新口,你说得对。我想我得想办法解决那个问题。我来自更高级的语言,所以我从不手动管理内存,所以我会读更多关于这方面的内容。谢谢,伙计们。我想这就是我想要的。我一直在寻找一种(以某种方式)取消对FGET返回值的引用的方法,但是是的,这就是我一直在寻找的。现在可以用了,格式都很奇怪。这样地。可能是我做错了什么吗?如果想法是学习C,那么他应该习惯malloc,而不是调用一个甚至不属于标准的函数。我会说,这是因为数组的大小。别忘了,
fgets
不仅读取,而且将EOF放入缓冲区。@mattfillips我同意你的说法。但我还要提醒你,POSIX是一个有效的标准。哦,马特和新口,你说得对。我想我得想办法解决那个问题。我来自更高级的语言,所以我从不手动管理内存,所以我会读更多关于这方面的内容。谢谢,伙计们。