在libconfig

时间:2016-01-28 20:53:00

标签: c libconfig

libconfig中的

- 是否可以动态枚举密钥?

例如,在他们的repo中的这个example配置文件中 - 如果有人在hours部分发明了更多天,代码是否可以动态枚举它们并打印出来?

查看文档,我看到很多代码可以获取特定的字符串,或者列出一个数组,但我找不到枚举配置部分键的示例。

修改

收到一些downvotes,所以我觉得我还有另一个更具体的裂缝。

我想使用libconfig来跟踪应用程序中的某些状态,在应用程序启动时读取上次已知状态,并在退出时再次将其写出来。我的应用程序将事物存储在一个树(深度为2)中 - 所以这可能是一个很好的表示为libconfig兼容文件中的关联数组,如下所示。关键是Ids列表(1234/4567)可以改变。我可以在另一个数组中跟踪它们,但如果我可以枚举下面ids数组中的“键”,那就更整洁了。

所以

ids = {
    "1234" = [1,2,3]
    "4567" = [9,10,11,23]

}

例如(伪代码)

foreach $key(config_get_keys_under(&configroot)){
    config_get_String($key)
}

我在头文件中看不到任何明显的东西。

1 个答案:

答案 0 :(得分:2)

您可以使用config_setting_get_elem函数获取组,数组或列表的第n个元素,然后(如果它的组)使用config_setting_name来获取它名称。但是AFAIK你不能在关键名中使用数字。请考虑以下配置结构:

ids = (
    {
         key = "1234";
         value = [1, 2, 3];
    },
    {
         key = "4567";
         value = [9, 10, 11, 23];
    }
);

然后,您可以使用以下代码轻松枚举ids的所有成员获取所需的值:

#include <stdio.h>
#include <libconfig.h>

int main(int argc, char **argv) {
    struct config_t cfg;
    char *file = "config.cfg";

    config_init(&cfg);

    /* Load the file */
    printf("loading [%s]...\n", file);
    if (!config_read_file(&cfg, file)) {
        printf("failed\n");
        return 1;
    }
    config_setting_t *setting, *member, *array;
    setting = config_lookup(&cfg, "ids");
    if (setting == NULL) {
        printf("no ids\n");
        return 2;
    }
    int n = 0, k, v;
    char const *str;
    while (1) {
        member = config_setting_get_elem(setting, n);
        if (member == NULL) {
            break;
        }
        printf("element %d\n", n);
        if (config_setting_lookup_string(member, "key", &str)) {
            printf("  key = %s\n", str);
        }
        array = config_setting_get_member(member, "value");
        k = 0;
        if (array) {
            printf("  values = [ ");
            while (1) {
                if (config_setting_get_elem(array, k) == NULL) {
                    break;
                }
                v = config_setting_get_int_elem(array, k);
                printf("%s%d", k == 0 ? "" : ", ", v);
                ++k;
            }
            printf(" ]\n");
        }

        ++n;
    }
    printf("done\n");
    /* Free the configuration */
    config_destroy(&cfg);

    return 0;
}