【问题标题】:Read a file to a 2D array in C将文件读入 C 中的二维数组
【发布时间】:2011-10-19 03:13:17
【问题描述】:

我正在学习 C,我决定制作一个文字游戏作为我的学习项目。所以我正在尝试这个将文本文件读入二维数组的原始“解析器”,但有一个问题:这个地图不使用 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;
}

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

uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu
uuuuuuuuuu

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

【问题讨论】:

  • C 中没有字符串,只有字符数组。因此你不能分配“字符串”!相反,请使用strncpy(),并确保您了解所涉及的内存管理。

标签: c parsing file-io multidimensional-array


【解决方案1】:

您应该已经对从文件中读取的内容进行了 strdup 处理。用这个替换文件读取块:

/* 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 <string.h>

【讨论】:

  • 我想这就是我想要的。我一直在寻找一种(以某种方式)取消引用 fgets 的返回值的方法,但是是的,这就是我想要的。它现在有点工作,它的格式都很奇怪。喜欢这个pastebin.com/1F2D5zNp。会不会是我做错了什么?
  • 如果这个想法是学习C,那么他应该习惯malloc,而不是调用一个甚至不属于标准的函数。
  • 这是因为数组大小,我会说。不要忘记fgets 不仅会读取,还会将 EOF 放入缓冲区。
  • @MattPhillips 我同意你所说的。但我也必须提醒您,POSIX 是一个有效的标准。
  • 哦,Matt 和 shinkou,你是对的。我想我得想办法解决这个问题。而且我来自高级语言,所以我从来没有手动管理内存,所以我会阅读更多关于它的内容。谢谢,伙计们。
【解决方案2】:

主要问题是

char *map[ROWS][COLS];

只为 ROWS x COLS char pointers 分配空间,它不为字符串本身分配空间。因此,您在每次迭代时都在不断地覆盖 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);
    }
}

【讨论】:

  • 嗯,我收到了incompatible implicit declaration of built-in function ‘malloc’。也许我错过了什么?会不会是我的 gcc?哦,我必须用 *charbuffer 更改 charbuffer[3],否则我会收到 incompatible types when assigning to type ‘char[3] from type ‘char *’ 错误。
  • @user1002327 关于 charbuffer[3] -> charbuffer*,忘了说。至于malloc,试试#include "stdlib.h"。
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2014-04-06
相关资源
最近更新 更多