【问题标题】:Dealing with sections of INI files with Boost.Program_options使用 Boost.Program_options 处理 INI 文件的各个部分
【发布时间】:2011-05-23 10:53:12
【问题描述】:

我正在尝试在 Linux 中解析配置 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;
 }

【问题讨论】:

    标签: c++ configuration-files ini boost-program-options


    【解决方案1】:

    我使用的是来自 program_options 的parse_config_file,所以它可能会有所不同,但如果您在[SectionName] 中有类似name=value 的名称,则该选项的名称是SectionName.name。

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

    【讨论】:

    • 这也是一个非常典型的例子。我已经有了可以轻松转换为实际值的字典。谢谢
    【解决方案2】:

    正如 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
    

    【讨论】:

    • 酷!非常感谢!我看错了,我错过了部分名称。非常感谢!
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2015-11-07
    • 2018-08-08
    • 2011-05-29
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多