C ++ boost :: program_options чтение аргументов, совместимых с getopt_long

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

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

Я пробовал много возможностей из boost :: 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 ::gorith :: trim () все будет так, как я хочу.

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

РЕДАКТИРОВАТЬ
Я заметил, что флаги выше не работают с незарегистрированными аргументами. Я зарегистрировал варианты:

  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?

9

Решение

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

«ПО УМОЛЧАНИЮ» — это имя раздела файла конфигурации. Можешь попробовать.

1

Другие решения


По вопросам рекламы [email protected]