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;
 }
Était-ce utile?

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>()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top