Функция чтения файлов INI направляет неправильные значения в мою структуру. Как мне решить эту проблему? - PullRequest
0 голосов
/ 19 января 2019

Это для проекта для университета (небольшая копия игры Catan), и я немного борюсь с этой частью, у нас есть чтение файла INI с довольно простым форматированием, в нем есть только некоторые комментарии, начинающиеся с '; ' и тогда это просто теги со значением впереди:

xdim=4
ydim=5
N=D
S=L2
E=S10
W=D
etc...

У меня есть эта функция, чтобы читать из INI-файла и адресовать прочитанные значения правильному элементу структуры. Но кажется, что он даже не читает файл, структура представляет собой простую структуру с xdim и ydim, после того, как я вызываю func xdim '& d & d & d & d & d и т. Д ...', а ydim 0

Я попытался поместить в некоторые файлы printf только для того, чтобы проверить, правильно ли читаются значения из самого файла INI, где ничего не печатается.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 128

typedef struct UNIT { /**struct used in an array for the rest of the INI values*/
    char N[4];
    char S[4];
    char W[4];
    char E[4];
    char Building;
}UNIT;

typedef struct{ /**This is declared in main and passed to the functions*/
    UNIT *grid;
    unsigned int xdim;
    unsigned int ydim;
} MAP_CONFIG;

void set_config_val(MAP_CONFIG *config, const char *key, int val) {

    if (config == NULL)
    return;
    if (strcmp(key, "xdim") == 0){
        printf("here");
        config->xdim = val;
    }
    else if (strcmp(key, "ydim") == 0){
        printf("here");
        config->ydim = val;
    }
    else{
        ;
    }
}

void read_config(MAP_CONFIG *config,FILE *f) {

    char str[MAX];
    char *token;
    const char *delim = "=\n";

    while (1) {
        fgets(str, MAX, f);
        if(feof(f)!= 0) break;
        puts(str);
        if (strchr(str, '=')!=NULL) {
            char varname[MAX];
            int value;

            token = strtok(str, delim);
            strcpy(varname, token);

            token = strtok(NULL, delim);
            value = atoi(token);
            printf("&d", token);
            set_config_val(config, varname, value);
        }
    }



    config = malloc(sizeof(MAP_CONFIG));
    config->grid = calloc(config->xdim * config->ydim, sizeof(UNIT));



    close(f);
    return;
}

функция открытия файла:

FILE *openFile(char *nome, char *mode) {
    FILE *f;
    printf("Opening file %s\n", nome);
    f = fopen(nome, mode);

    if (f == NULL) {
        fprintf(stderr, "*** It was not possible to open the file %s.", nome);
        exit(1);    
    }
    return f;
}

проверка основных im с использованием:

int main(int argc, char **argv) {
    MAP_CONFIG map;
    MAP_CONFIG *mapa = &map;
    FILE *f;
    char *filename;
    for (int i = 0; i < argc; i++)
        printf("Parametro %d: %s\n", i, argv[i]);
    if (argc >= 2) {
        filename = argv[1];
    }
    else {
        printf("Opening base map file..\n");
        filename = "mapa.ini";
    }

    f = openFile(filename, "r");
    read_config(mapa, f);
    printf("%d %d", map.xdim, map.ydim);

    return 0;
}

Я просто хочу, чтобы он прочитал xdim и ydim, а затем повторил процесс для массива структур для каждой структуры, чтобы получить правильное значение N, S, E, W, присутствующего в файле INI ... Справка !

...