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)
}
我在头文件中看不到任何明显的东西。
答案 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;
}