2010-12-10 3 views
1

Я пытаюсь разобрать конфигурационные файлы INI в Linux. Я хотел бы использовать Boost, и кто-то указал мне библиотеку program options.Работа с разделами файлов INI с Boost.Program_options

Дело в том, что я могу читать строки с синтаксисом field=value, но как иметь дело с разными разделами, то есть линиями, имеющими [Section_Name]? Приведенный ниже код имеет всегда исключение

Под кодом, который я пробовал. Благодаря 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; 
} 

ответ

4

Как указывалось ранее etarion, идентификатор опции должен быть приставкой их ограждающей секции. Вот простой модификации на код, чтобы продемонстрировать:

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

Эта программа выводит:

1 
2 
test option 
+0

Классный! Большое спасибо! Я неправильно понял, и я пропустил имена разделов. Большое спасибо! – 2010-12-10 14:44:31

6

Я использую parse_config_file из program_options, так что он может быть разным, но имя опции SectionName.name если у вас есть что-то вроде name=value в [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

Кроме того, это один является очень образец. У меня уже есть диктатор, который можно легко отнести к реальным значениям. Thanks – 2010-12-10 14:45:43