Libconfig编辑配置值

时间:2012-04-30 23:49:03

标签: c++ configuration libconfig

我正在使用libconfig在我的C ++游戏中读取/配置文件。

现在我只有一个名为video.cfg的配置文件:

#Video config file
video:
{
    fps:
    {
      limited = true;
      value = 20;
    };
};

此配置文件处理游戏的视频设置。

我正在尝试编写一个非常基本的控制台程序,它根据用户输入修改此值。但是我不知道该怎么做。我在libconfig手册中找不到任何内容,谷歌也没有。

那么如何在Libconfig中编辑值?

2 个答案:

答案 0 :(得分:3)

#include <libconfig.h>

int main() {
   config_t cfg;
   config_setting_t *vid_fps_lim = 0;
   config_setting_t *vid_fps_val = 0;

   config_init(&cfg);

   if (config_read_file(&cfg, "myconfig") == CONFIG_TRUE) {

      /* lookup the settings we want */
      vid_fps_lim = config_lookup(&cfg, "video.fps.limited");
      vid_fps_val = config_lookup(&cfg, "video.fps.value");

      /* print the current settings */
      printf("video.fps.limited = %i\n", config_setting_get_bool(vid_fps_lim));
      printf("video.fps.value = %i\n", config_setting_get_int(vid_fps_val));

      /* modify the settings */
      config_setting_set_bool(vid_fps_lim, 1);
      config_setting_set_int(vid_fps_val, 60);

      /* write the modified config back */
      config_write_file(&cfg, "myconfig");
   }

   config_destroy(&cfg);

   return 0;
}

我命名文件“lcex.c”和配置文件“myconfig”它使用以下内容在我的Debian Linux机器上构建和运行...

gcc `pkg-config --cflags libconfig` lcex.c -o lcex `pkg-config --libs libconfig`

./lcex

运行应用程序后打开配置文件,您会看到值已更新。

免责声明...错误处理遗漏,使其更容易阅读。我没有使用-Wall等构建。与任何API一样,阅读文档并处理潜在的错误。

答案 1 :(得分:1)

我在搜索将libconfig写入输出到字符串而不是文件的方法时遇到了这个问题。我看到这里没有可接受的答案,所以我想我会为后人提供一个,即使这个问题已经超过3年了。

#include <stdint.h>
#include <string>

#include "libconfig.h++"

int32_t
main (void) {
    libconfig::Config config;
    std::string file = "test.conf";

    try {
        config.readFile(file.c_str());

        libconfig::Setting &limited = config.lookup("video.fps.limited");
        libconfig::Setting &value = config.lookup("video.fps.value");

        limited = false;
        value = 60;

        config.writeFile(file.c_str());
    }
    catch (...) {
        // Do something reasonable with exceptions here.  Do not catch (...)
    }

    return 0;
}

希望能帮助别人!