Я никогда раньше не работал с файлами конфигурации, но мне интересно использовать его в качестве файла параметров для инженерного кода, который я пишу.
Не будучи профессиональным программистом, я потратил два дня, пытаясь выяснить, как импортировать простой список или настройку массива с помощью libconfig, и я, кажется, никуда не денусь. Грубо работает от пример здесь, Я могу успешно импортировать скалярные настройки, такие как
(Importtest.cfg)
mynumber = 1;
используя основную функцию, такую как
Config cfg;
// check for I/O and parse errors
try
{
cfg.readFile("importtest.cfg");
}
catch(const FileIOException &fioex)
{
std::cerr << "I/O error while reading config file." << std::endl;
return(EXIT_FAILURE);
}
catch(const ParseException &pex)
{
std::cerr << "Parse error at " << pex.getFile() << " : line " << pex.getLine() << " - " << pex.getError() << std::endl;
return(EXIT_FAILURE);
}
// look for 'mynumber'
try
{
int number = cfg.lookup("mynumber");
std::cout << "your number is " << number << std::endl;
}
catch(const SettingNotFoundException &nfex)
{
std::cerr << "No 'mynumber' setting in configuration file." << std::endl;
}
Я получаю ожидаемый результат
your number is 1
Но я не могу импортировать простую настройку списка, такую как
mylist = (1,2,3,4);
Аналогичным образом. Я пробовал несколько решений (например, создание корневых настроек), но на самом деле не понимаю ни одно из них.
Буду признателен за любую оказанную помощь.
Мне также понадобилось время, чтобы понять это. Вот как я наконец это сделал, основываясь на https://github.com/hyperrealm/libconfig/blob/master/examples/c%2B%2B/example1.cpp:
файл example_simple.cfg:
albums =
(
{
title = "one title";
year = 2017;
songs = ["first song", "second song"];
},
{
title = "another title";
year = 2015;
songs = ["first song", "second song", "third song"];
}
);
Прочитайте это с помощью libconfig C ++ API:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <vector>
#include <libconfig.h++>
using namespace std;
using namespace libconfig;
int main(int argc, char **argv)
{
Config cfg;
// Read the file. If there is an error, report it and exit.
try
{
cfg.readFile("../example_simple.cfg");
}
catch(const FileIOException &fioex)
{
std::cerr << "I/O error while reading file." << std::endl;
return(EXIT_FAILURE);
}
catch(const ParseException &pex)
{
std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
<< " - " << pex.getError() << std::endl;
return(EXIT_FAILURE);
}
const Setting& root = cfg.getRoot();
try
{
const Setting &albums = root["albums"];
for(int i = 0; i < albums.getLength(); ++i)
{
const Setting &album = albums[i];
string my_title;
int my_year;
vector<string> my_songs;
album.lookupValue("title", my_title);
cout << "title: " << my_title << endl;
album.lookupValue("year", my_year);
cout << "year: " << my_year << endl;
const Setting &songs_settings = album.lookup("songs");
vector<string> songs;
for (int n = 0; n < songs_settings.getLength(); ++n)
{
my_songs.push_back(songs_settings[i]);
cout << "song number " << n << ": " << my_songs[n] << endl;
}
}
}
catch(const SettingNotFoundException &nfex)
{
// Ignore.
}
return(EXIT_SUCCESS);
}
Других решений пока нет …