为什么 config_read_file() 返回 config_false?

Why is config_read_file() returning config_false?

我一直在为项目中的配置文件使用 libconfig。当我通过 source_to_use、config_read_file() returns config_true 从源中删除双引号时,也出现语法错误。语法错误会导致我的 getter for the source_to_use option 转到 default case。也因为这个我的 getter 对于源数组,也将转到其他情况。难道这只是我用 libconfig 格式犯了一个简单的语法错误?

这是我正在使用的配置文件:

#config for walld

#colors
colors = TRUE;

source_to_use: "sources";

default:
[
    "/home/seth/Pictures/kimi.png"
];

sources:
[
    "/home/seth/.walld/persona",
    "/home/seth/.walld/image-urls"
];

这是我读到的函数:

settings* read_config(const char* config_file, const char* home_dir) {
    settings* options = malloc(sizeof(settings));

    config_t config;
    config_setting_t* setting;
    const char* source;
    int colors;

    config_init(&config);

    if (config_read_file(&config, config_file) == CONFIG_TRUE) {
        config_destroy(&config);
        return NULL;
    }

    if (config_lookup_bool(&config, "colors", &colors)) {
        options->colors = colors;
    }
    else {
        options->colors = 0;
    }

    if (config_lookup_string(&config, "source_to_use", &source)) {
        //NOP
    }
    else {
        source = "default";
    }

    setting = config_lookup(&config, source);

    if (setting != NULL) {
        int count = config_setting_length(setting);

        linked_node* entry_point = add_node_to_list(NULL, NULL);

        linked_node* current = entry_point;

        options->sources = entry_point;


        for (int i = 0; i < count; i++) {
            char* item = config_setting_get_string_elem(setting, i);

            current = add_node_to_list(current, item);
        }
    }
    else {
        options->sources = malloc(sizeof(linked_node));
        int char_count = snprintf(NULL, 0, "%s%s", home_dir, "/.walld/images");
        if (char_count <= 0) {
            //tough luck
            abort();
        }
        char* default_folder = malloc(char_count + 1U);

        if (default_folder == NULL) {
            //tough luck
            abort();
        }

        snprintf(default_folder, char_count + 1U, "%s%s", home_dir, "/.walld/images");

        options->sources->image = default_folder;
    }

    config_destroy(&config);

    return options;
}

在您的 read_config 函数中,您的第一个 if 是:

if (config_read_file(&config, config_file) == CONFIG_TRUE) {
    config_destroy(&config);
    return NULL;
}

if 的含义是相反的,所以如果文件的读取 有效 ,那么你将 return 一个 NULL .

所以,你想反转这个if的意义:

if (config_read_file(&config, config_file) != CONFIG_TRUE) {
    config_destroy(&config);
    return NULL;
}

或者您可以[可能]使用:

if (config_read_file(&config, config_file) == CONFIG_FALSE) {