C как правильно fscanf с числами и строками? - PullRequest
0 голосов
/ 19 апреля 2019

Я пишу игру на SDL2 для школьного проекта, на C, у меня есть конфиг, в котором перечислены пары ключ-значение как:

groundTiles: images/Overworld/groundTiles.png и cellHeight: 32

Как мне разобрать эти данные?Потому что мои попытки приводят к тому, что целые числа читаются правильно, но в строках либо отсутствуют символы, либо они полностью повреждены.Я немного новичок в C, по крайней мере, с точки зрения файла ввода / вывода

Мне нужен еще один взгляд на этот код, потому что я уже потратил слишком много часов на это.

Может ли это иметь какое-то отношение к этой структуре в моем заголовке и как я использую ее для хранения временных данных?

typedef struct TileMapData_S 
{
    Uint32 col, row, cellWidth, cellHeight, numCells;
    char *mapName;
    char *emptyTileName;
    Bool flag;
    SDL_Color *colors;
    Tile* tileTypes;
    char *colorMap;
}TileMapData;

Я попытался сделать ее безымянной структурой в функции, затемисточник.Неудачно.Я пытался просто не использовать struct и fscanf'ing каждый кусок данных в отдельной переменной.То же самое, не повезло.Если я выполнил fscanf(file, "%s %s", buf, temp) со значением temp, являющимся значением ключа, который я анализирую, то я получаю первое совпадение со строкой, которую я ищу, а затем копирует себя в два других символа *, которые содержат именамои спрайты / файлы.

РЕДАКТИРОВАТЬ: Это моя попытка, основанная на комментариях, которая не работает, любая оценка будет оценена

    while (!data->flag)
    {
        while (tempString != EOF)
        {
            tempString = strtok(buf, " \n");

            if (strcmp(tempString, "width:") == 0)
            {
                tempString = strtok(buf, "\n\0 ");
                map->numColumns = atoi(tempString);

                continue;
            }
            .
            .
            .
            if (strcmp(tempString, "groundTiles:") == 0)
            {
                data->mapName = strtok(buf, "\n\0 ");

                data->mapName = tempString;

                if (data->mapName != NULL)
                {
                    data->flag = true;
                }
                else
                {
                    data->flag = false;
                }

                continue;
            }
            .
            .
            .

            tempString = fgets(buf, sizeof(buf), file);
            slog(buf);
        }

        rewind(file);
    }

Я ожидал получить строку, которую я хотел,без пробела / символа с нулевым символом в конце, но завершился бесконечным циклом), выполнив для этого strcmp и известную строку (groundTiles :), тогда второй fscanf должен предоставить строку images/Overworld/groundTiles.png

...