用Boost.Program_options处理INI文件的部分

问题描述:

我想解析Linux中的配置INI文件。 我想用Boost,有人指给我program options库。用Boost.Program_options处理INI文件的部分

问题是我可以读取具有语法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; 
} 

正如前面由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

我使用的是从program_options parse_config_file

,所以它可能是不同的,但有选项的名称是SectionName.name如果您有类似的[SectionName]name=value

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

另外这是一个非常样本。我已经有了能够轻易实现真正价值的论点。谢谢 – 2010-12-10 14:45:43