2010-12-10 61 views
1

我想解析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; 
} 

回答

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
我使用的是從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