2011-01-16 3 views
12

나는 구성 파일에서 매개 변수를 얻으려면 boost :: program_options를 사용하고 있습니다.거기에 부스트 프로그램 옵션에 대한 설정 파일을 인쇄하는 방법입니다

나는 파일을 손으로 만들 수 있고 프로그램 옵션이 파일을 분석 할 수 있음을 알고 있습니다. 하지만 난 프로그램을 자동으로 파일을 생성하는 방법을 찾고 있어요. 옵션의 이름을 인쇄하면 그 가치를 의미합니다. 예를 들어 :

>./main init.cfg 
: 다음 텍스트 편집기를 사용하여 값을 변경하는 파일로 이동하고이 파일을 사용하는 것이이

[wave packet] 
width = 1 
position = 2.0 
[calculation parameters] 
levels = 15 

과 같은 init.cfg을 생성 할 옵션없이

>./main 

좋은 접근 방법은 variables_map에 operator<<이 있어야한다는 것입니다. 이 방법은 그냥 파일에 쓸 수 있습니다. 값을 변경하십시오. 파일을 읽으십시오. 모두 동일한 형식이며 각 행을 쓸 필요가 없습니다.

설명서 또는 예제에서 그와 같은 것을 찾을 수 없습니다. 가능한 경우 알려 주시기 바랍니다

편집 : Sam Miller는 섹션에서 ini 파일을 구문 분석하는 방법을 보여 줬습니다. 그러나 boost :: program_options :: variables_map VM에서 값을 가져 오는 데는 여전히 문제가 있습니다. 내가 대신 it->second.value()의 다음

for(po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it) 
    { 
    if(it->first!="help"&&it->first!="config") 
    cout << "first - " << it->first << ", second - " << it->second.value() << "\n"; 
    } 

을 시도 오류를 얻었다. 나는 또한 it->second을 시도했다. 나는 또한 오류가있어 :

icpc -lboost_serialization -lboost_program_options -c programOptions.cc 
programOptions.cc(60): error: no operator "<<" matches these operands 
      operand types are: std::basic_ostream<char, std::char_traits<char>> << boost::any 
     cout << "first - " << it->first << ", second - " << it->second.value() << "\n"; 
                ^

compilation aborted for programOptions.cc (code 2) 
make: *** [programOptions.o] Error 2 

을 내가하는 int를 내 값의 it->second.as<int>() 전부는 아니지만을 사용하면 내가 제대로 값을 얻을 내가 이중에 도달하면, 프로그램이 충돌합니다 :

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >' 
    what(): boost::bad_any_cast: failed conversion using boost::any_cast 

답변

12

가있다 내가 아는 program_options를 사용하는 방법이 아닙니다. 당신은 write the ini file에 속성 트리 라이브러리를 사용할 수 있습니다.

macmini:stackoverflow samm$ cat property.cc 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/ini_parser.hpp> 

#include <iostream> 

int 
main() 
{ 
    using boost::property_tree::ptree; 

    ptree root; 

    ptree wave_packet; 
    wave_packet.put("width", "1"); 
    wave_packet.put("position", "2.0"); 

    ptree calculation_parameters; 
    calculation_parameters.put("levels", "15"); 

    root.push_front(
      ptree::value_type("calculation parameters", calculation_parameters) 
      ); 
    root.push_front(
      ptree::value_type("wave packet", wave_packet) 
      ); 

    write_ini(std::cout, root); 

    return 0; 
} 

macmini:stackoverflow samm$ g++ property.cc 
macmini:stackoverflow samm$ ./a.out 
[wave packet] 
width=1 
position=2.0 
[calculation parameters] 
levels=15 
macmini:stackoverflow samm$ 
+0

간단한 예를 쓸 수있는 방법이 있습니까? 또는 어떻게 할지도 로드맵을 제공합니까? –

+0

@kirill_igum 예를 추가했습니다. –

0

는 지금까지 내가 질문을 이해, 그것은 주어진 option_description에 따라 설정 파일을 작성하는 방법에 관한 것입니다 : 여기

짧은 예이다.

가능한 해결책은 config_description을 구성 파일에 작성하는 방법입니다. 모든 매개 변수에 기본값이 있다는 사실과 관련이 있습니다. 당신이 config 파일에서 섹션을 필요로하는 경우 문제가

algorithmsDesc_.add_options() 
    ("general.blur_Width", po::value<int>(&varWhereToStoreValue)->default_value(3), "Gaussian blur aperture width") 

:

void SaveDefaultConfig() 
{ 
    boost::filesystem::ofstream configFile(configFilePath_); 
    auto descOptions = algorithmsDesc_.options(); 
    boost::property_tree::ptree tree; 

    for (auto& option : descOptions) 
    { 
     std::string name = option->long_name(); 
     boost::any defaultValue; 
     option->semantic()->apply_default(defaultValue); 

     if (defaultValue.type() == typeid(std::string)) 
     { 
      std::string val = boost::any_cast<std::string>(defaultValue); 
      tree.put(name, val); 
     } 
     ///Add here additional else.. type() == typeid() if neccesary 
    } 

    //or write_ini 
    boost::property_tree::write_json(configFile, tree); 
} 

여기 algorithmsDesc는 같은 옵션을 설명 곳 즉, 부스트 : program_options을 :: options_description입니다. options_description에는 생성자를 통해 전달 된 캡션을 가져 오는 메소드가 없습니다. 그것을 얻는 더러운 방법은 print()로 만든 출력 스트림에서 잘라내는 것입니다.

함께 결합하면 간단합니다.