2010-12-10 6 views
1

Ich versuche, Konfiguration INI-Dateien in Linux zu analysieren. Ich möchte Boost verwenden und jemand zeigte mir die program options Bibliothek.Umgang mit Abschnitten von INI-Dateien mit Boost.Program_options

Die Sache ist, dass ich Zeilen mit der Syntax field=value lesen kann, aber wie man mit verschiedenen Abschnitten, d. H. Zeilen mit [Section_Name] darin umgehen? Mit dem Code unten habe ich immer eine Ausnahme

Unter dem Code habe ich versucht. Dank 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; 
} 

Antwort

4

Wie bereits von etarion erwähnt, muss die Kennung der Option durch ihre einschließenden Abschnitt vorangestellt werden. Hier ist eine einfache Änderung an Ihrem Code zu demonstrieren:

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

Dieses Programm Ausgänge:

1 
2 
test option 
+0

Cool! Danke vielmals! Ich habe es falsch gelesen und die Namen der Sektionen verpasst. Danke vielmals! –

6

Ich parse_config_file von program_options verwenden, so kann es anders sein, aber es der Name der Option ist SectionName.name, wenn Sie so etwas wie name=value in [SectionName] haben.

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

Auch dieses ist sehr Probe. Ich habe bereits das Dikton, das leicht zu echten Werten umgewandelt werden kann. Danke –