Считать файл в 2D массив в C - PullRequest
0 голосов
/ 19 октября 2011

Я изучаю 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, но это выглядит грязно, и я бросил его после прочтения о get.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Вы должны были бы strdup'ed содержимое, прочитанное из файла.Замените блок чтения файла следующим:

/* 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>
1 голос
/ 19 октября 2011

Основная проблема в том, что

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...