2014-12-24 10 views
9

기존 프로그램에서 업데이트를 개발 중입니다. Posix의 getopt_long()을 boost :: program_options으로 바꿉니다. 하지만해야 나의 작업은 작동하지 않습니다 : 내가 좋아하는 읽기 인수를 갖고 싶어 : 나는 부스트 :: program_options :: command_line_style에서 많은 가능성을 시도하고 있었다getopt_long과 호환되는 C++ boost :: program_options 인수 읽기

-server=www.example.com 
-c config.txt 

,하지만 내가하는 것 조합을 찾을 수 없습니다 getopt_long와 동등한 동작을 제공합니다.

-server=www.example.com 

내가 플래그가 필요합니다 :

command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent 

을하지만 난에 대한 설립 플래그 문제가 : 나는 플래그 것을 발견

-c config.txt 

나는 인수 것을 발견 :

command_line_style::allow_short | command_line_style::allow_dash_for_short | command_line_style::short_allow_next 

내가 원하는 것을 거의 알려줘. 거의 다음과 같습니다 :

ProgramOptionsParserTest.cpp:107: Failure 
Value of: params.config 
    Actual: " config.txt" 
Expected: expectedParams.config 
Which is: "config.txt" 

그래서 boost :: algorithm :: trim()을 사용하면 원하는대로됩니다.

내 질문은 : boost :: program_options 있지만 boost :: algorithm :: trim() 않고 -c config.txt 같은 인수를 처리 할 수 ​​있습니까?

EDIT 위의 플래그가 등록되지 않은 인수와 함께 작동하지 않는 것으로 나타났습니다. 내가 등록한 옵션 :

programOptionsDescription.add_options() 
     ("help,h", "display help message") 
     ("config,c", value<std::string>(), "use configfile") 
     ("server,s", value<std::string>(), "server") 
     ("ipport,p", value<uint16_t>(), "server port"); 

하지만 등록되지 않은 옵션을 사용하는 경우 (예, 내가 가진 basic_command_line_parser :: allow_unregistered()) :

-calibration=something 

내가 볼 :

the argument ('alibration=something') for option '-config' is invalid 

내 질문 이후 버전 : boost :: program_options를 사용하여 getopt_long으로 작업하는 인수를 처리하는 방법은 무엇입니까?

답변

1

boost::program_options을 사용하는 경우 매개 변수를 제대로 구문 분석하려면 '='기호가 필요합니다. 그것은 누락 된 경우 예외를 throw합니다. 그런데 boost::property_tree은 설정 파일을 구문 분석하는 데 아주 좋은 선택입니다. 코드 :

#include <iostream> 
#include <boost/propery_tree.hpp> 
#include <boost/propery_tree/ini_parse.hpp> 
int main() 
{ 
    string filename("test.conf"); 
    boost::property_tree::ptree parser; 
    boost::property_tree::ini_parser::read_ini(filename, parser); 
    const string param_1 = parser.get<string>("DEFAULT.-server"); 
    const string param_2 = parser.get<string>("DEFAULT.-c"); 
    cout << param_1 << ' ' << param_2 << endl; 
    return 0; 
} 

"기본은"구성 파일의 섹션 이름입니다. 너도해볼 수있어.

+0

이 답변은 관련이 없습니다. 문제는 명확하게 프로그램 옵션을 파싱하는 것을 목표로합니다 (posix getopt() 등) – user23573