2012-06-16 4 views
7

Согласно документации, которую я могу разобрать конфигурационные файлы в стиле:Boost - получить все записи в разделе

[main section] 
string = hello world. 
[foo] 
message = Hi ! 

Но мне нужно разобрать список плагинов:

[plugins] 
somePlugin. 
HelloWorldPlugin 
AnotherPlugin 
[settings] 
type = hello world 

Как я могу получить вектор строк, которые находятся в разделе плагинов?

ответ

10

Для форматирования конфигурационных файлов параметров программы, если строка не объявляет раздел, например [settings], тогда он должен быть в формате name=value. Для примера, запишите его в следующем виде:

[plugins] 
name = somePlugin 
name = HelloWorldPlugin 
name = AnotherPlugin 
[settings] 
type = hello world

Список плагинов теперь будет соответствовать опции «plugins.name», который должен быть multitoken вариант.

Ниже приведен пример программы, которая читает вышеуказанные параметры из файла settings.ini:

#include <boost/program_options.hpp> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

int main() 
{ 
    namespace po = boost::program_options; 

    typedef std::vector<std::string> plugin_names_t; 
    plugin_names_t plugin_names; 
    std::string settings_type; 

    // Setup options. 
    po::options_description desc("Options"); 
    desc.add_options() 
    ("plugins.name", po::value<plugin_names_t>(&plugin_names)->multitoken(), 
        "plugin names") 
    ("settings.type", po::value<std::string>(&settings_type), 
         "settings_type"); 

    // Load setting file. 
    po::variables_map vm; 
    std::ifstream settings_file("settings.ini" , std::ifstream::in); 
    po::store(po::parse_config_file(settings_file , desc), vm); 
    settings_file.close(); 
    po::notify(vm);  

    // Print settings. 
    typedef std::vector<std::string>::iterator iterator; 
    for (plugin_names_t::iterator iterator = plugin_names.begin(), 
             end = plugin_names.end(); 
     iterator < end; 
     ++iterator) 
    { 
    std::cout << "plugin.name: " << *iterator << std::endl; 
    } 
    std::cout << "settings.type: " << settings_type << std::endl; 

    return 0; 
} 

который производит следующий вывод:

plugin.name: somePlugin 
plugin.name: HelloWorldPlugin 
plugin.name: AnotherPlugin 
settings.type: hello world
+0

Спасибо, так что это не способ, как сделать это без необходимости иметь «имя =» перед именем плагина? – user1307957

+0

Без написания собственного анализатора клиентов, нет. –

+0

Хорошо, неважно. – user1307957

 Смежные вопросы

  • Нет связанных вопросов^_^