2014-12-24 5 views
9

Я разрабатываю обновление в существующей программе. Я заменяю getopt_long() в Posix с boost :: program_options. Но моя работа не работает, как я: Я хочу иметь читаемые аргументы, как:C++ boost :: program_options чтение аргументов, совместимых с getopt_long

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

Я пытался много возможностей от повышающего :: program_options :: command_line_style, но я не могу найти комбинации, которые бы дать поведение, равное 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() он будет, как я хочу.

Так что мой вопрос: возможно ли обрабатывать такие аргументы, как -c config.txt с boost :: program_options, но без boost :: algorithm :: trim()?

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 

Мои Вопрос после выпуска: как обрабатывать аргументы, работающие с getopt_long с boost :: program_options?

ответ

1

Если вы используете boost::program_options, для правильного анализа параметров необходимо использовать символ '='. Он будет генерировать исключение, если оно отсутствует. Кстати, 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; 
} 

"по умолчанию" это название раздела CONFIGURE файла. Можешь попробовать.

+0

Я думаю, что этот ответ не связан. Вопрос явно направлен на анализ параметров программы (posix getopt() и т. Д.), – user23573

Смежные вопросы