2010-12-10 38 views
1

J'essaie d'analyser les fichiers INI de configuration sous Linux. Je voudrais utiliser Boost et quelqu'un m'a pointé la bibliothèque program options. Le fait est que je peux lire des lignes ayant la syntaxe field=value, mais comment traiter différentes sections, c'est-à-dire des lignes ayant [Section_Name] dedans? Avec le code ci-dessous j'ai toujours une exceptionTraitement de sections de fichiers INI avec Boost.Program_options

Ci-dessous 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; 
} 

Répondre

4

Comme indiqué précédemment par etarion, l'identifiant de l'option doit être préfixés par le 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 Sorties:

1 
2 
test option 
+0

Cool! Merci beaucoup! J'ai mal lu et j'ai raté les noms des sections. Merci beaucoup! –

6

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>() 
+0

Aussi celui-ci est très échantillon. J'ai déjà le dictonary qui peut être facilement converti en valeurs réelles. Merci –