Traiter avec des sections de fichiers INI avec Boost.Program_options
-
08-10-2019 - |
Question
Je suis en train d'analyser la configuration des fichiers INI sous Linux.
Je voudrais utiliser Boost et quelqu'un m'a signalé la bibliothèque program options
.
La chose est que je peux lire des lignes ayant la field=value
de syntaxe, mais la façon de traiter avec des sections différentes à savoir des lignes ayant [Section_Name]
en elle?
Avec le code ci-dessous j'ai toujours une exception
Voici le code que j'ai essayé. Merci AFG
const char* testFileName = "file.ini";
std::ifstream s;
s.open( testFileName );
namespace pod = boost::program_options::detail;
std::set<std::string> options;
options.insert("a");
options.insert("b");
options.insert("c");
//parser
for (pod::config_file_iterator i(s, options), e ; i != e; ++i)
{
std::cout << i->value[0] << std::endl;
}
La solution
Comme indiqué précédemment par etarion, l'identifiant de l'option doit être préfixé par leur section englobante . Voici une simple modification sur votre code pour démontrer:
int main()
{
std::stringstream s(
"[Test]\n"
"a = 1\n"
"b = 2\n"
"c = test option\n");
std::set<std::string> options;
options.insert("Test.a");
options.insert("Test.b");
options.insert("Test.c");
for (boost::program_options::detail::config_file_iterator i(s, options), e ; i != e; ++i)
std::cout << i->value[0] << std::endl;
}
Ce programme affiche:
1
2
test option
Autres conseils
J'utilise parse_config_file
de program_options, donc il peut être différent, mais le nom de l'option est SectionName.name
si vous avez quelque chose comme name=value
dans [SectionName]
.
std::string config_filename = "foo.ini";
namespace po = boost::program_options;
po::options_description my_options("Options");
int my_opt;
my_options.add_options()
("SectionName.my_opt", po::value(&my_opt)->default_value(64), "My option");
std::ifstream config_stream(config_filename.c_str());
po::variables_map vm;
po::store(po::parse_config_file(config_stream, my_options), vm);
po::notify(vm);
// value is now in my_opt, also accessible by vm["SectionName.my_opt"].as<int>()