2016-01-28 4 views
1

У меня есть файл конфигурации myCfg.cfg который выглядит следующим образом:libconfig ++: добавление параметра к корню дерева конфигурации

keyA = 1.0 
keyB = 2 
keyC = "hello" 

Обратите внимание, что все настройки находятся в корне дерева конфигурации.

Я хочу, чтобы моя программа на C++ загружала этот файл, а затем добавляла новый параметр, ключ которого равен keyD и присваивает ему целочисленное значение 5. В конце концов, MyCfg должен выглядеть в памяти:

keyA = 1.0 
keyB = 2 
keyC = "hello" 
keyD = 5 

Первый файл myCfg.cfg загружается построить MyCfg. Затем значение keyD должно быть добавлено в корень MyCfg. libconfig documentation указывает, что Setting::add() метод:

добавить [s] новый ребенок установка с заданным именем и типом для установки, которая должна быть группа

Однако нет никаких group в MyCfg ... Итак, как добавить параметр в корень объекта Config?

+0

@Gluttton Я не уверен, что вы подразумеваете под «у вас сохраняются настройки?». Сначала я создаю экземпляр 'Config', читая конфигурацию из файла * .cfg, затем я беру этот объект' Config', и я пытаюсь добавить к нему параметр. Я никогда не пытаюсь написать новый файл * .cfg, который будет соответствовать введенному файлу * .cfg и дополнительной настройке. –

+0

@ Gluttton no Я не называл 'writeFile()' и не собираюсь это делать. Вот больше информации о контексте: я использую объект 'Config' как набор параметров для запуска моего кода. В коде есть две аналогичные процедуры: во-первых, параметр должен быть выбран пользователем, указав параметр в файле * .cfg. В другом случае имеет смысл только одно значение для этого параметра. Поэтому, чтобы скрыть его от пользователя, я требую, чтобы он/она написал файл конфигурации без этой настройки, и код должен добавить его впоследствии. –

ответ

1

Похоже, все, что вам нужно: getRoot().

Вот пример:

#include <iostream> 
#include "libconfig.h++" 


int main() 
{ 
    libconfig::Config MyCfg; 
    std::string file = "myCfg.cfg"; 

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

     libconfig::Setting & root = MyCfg.getRoot(); 
     // This also works. 
     // libconfig::Setting & root = MyCfg.lookup (""); 
     libconfig::Setting & keyD = root.add ("KeyD", libconfig::Setting::TypeInt); 
     keyD = 5; 

     // You dont need it, but it's just for testing. 
     MyCfg.writeFile (file.c_str()); 
    } 
    catch (...) { 
     std::cout << "Error caused!" << std::endl; 
    } 

    return 0; 
} 
+0

Да, спасибо! (Черт, это было в примере/example2.cpp ... RTFM для себя ...) –

+0

После того, как он работал с 'getRoot()', я понял, что 'libconfig :: Setting & root = MyCfg.getRoot()' можно заменить либо на '' libconfig :: Setting & root = MyCfg.lookup ("") 'или' libconfig :: Setting & root = MyCfg.getRoot (".") '. Все три работают даже, хотя 'getRoot()' на сегодняшний день является самым элегантным! Возможно, вы хотели бы добавить это замечание к своему ответу? Я думаю, что в моем коде была ошибка, и это меня смутило ... В результате я редактировал свой вопрос. Еще раз спасибо за помощь! –

+0

Я добавил замечание к моему вопросу о 'lookup (" ")'. Но версия 'MyCfg.getRoot (". ")' Не работает для моего (я не могу ее скомпилировать, и это так, и это соответствует документации, потому что нет версии 'getRoot' с параметрами). – Gluttton

Смежные вопросы