Работа с разделами INI-файлов с Boost.Program_options - PullRequest
2 голосов
/ 10 декабря 2010

Я пытаюсь проанализировать файлы конфигурации INI в Linux.Я хотел бы использовать 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;
 }

Ответы [ 2 ]

8 голосов
/ 10 декабря 2010

Я использую 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>()
5 голосов
/ 10 декабря 2010

Как указано ранее 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
...