У меня есть файл cfg как следующее:
parameter1="hello"parameter2=22
parameter3=12
С помощью boost_program
чтобы прочитать все параметры отлично работает с этим кодом:
po::options_description options("Options");
options.add_options()
("help,h", "produce help message")
("parameter1", po::value<string>(¶meter1)->default_value("bye"),
"parameter1")
("parameter2", po::value<int>(¶meter2)->default_value(2),
"parameter2")
("parameter3", po::value<int>(¶meter3)->default_value(4),
"parameter3");po::variables_map vm;
po::store(po::parse_command_line(argc, argv, options), vm);
notify(vm);
try
{
po::store(po::parse_config_file< char >(filePath, options), vm);
}
catch (const std::exception& e)
{
std::cerr << "Error parsing file: " << filePath << ": " << e.what() << std::endl;
}
…
Но когда я пытаюсь сделать универсальный метод, где я просто хочу прочитать один параметр, данный из вызова, у меня возникает ошибка синтаксического анализа.
Я хочу прочитать второй параметр, например, поэтому я пишу это:
const char parameter_string = "parameter2";
int default = 30;
int parameter;
getparameter(parameter_string,parameter,default);
и идет в метод получает параметр, где это то, что у меня есть на этот раз:
…
po::options_description options("Options");
options.add_options()
("help,h", "produce help message")
(parameter_string, po::value<int>(¶meter)->default_value(default),
"reading parameter");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, options), vm);
notify(vm);
но ошибка такова:
Ошибка разбора файла: file.cfg: неизвестный параметр параметр1
Поэтому мой вопрос: возможно ли чтение только одного параметра из файла или необходимо проанализировать все параметры с помощью boost_program
в options.add_option
включая столько строк, сколько параметров я пишу в файле конфигурации, а затем беру значение из параметра, который я хочу.
использование allow_unregistered
функция:
Указывает, что незарегистрированные параметры разрешены и должны быть переданы
хоть. Для каждой команды, как токен, который выглядит как опция, но делает
не содержит распознанное имя, экземпляр basic_option будет
быть добавлен к результату, с полем «нераспознанное» установлено значение «истина». Это
можно собрать все нераспознанные варианты с помощью
Функция collect_unrecognized.
Поскольку я использую «parse_config_file», я вижу в документации, что «allow_unregistered» по умолчанию имеет значение false.
template<typename charT>
BOOST_PROGRAM_OPTIONS_DECL basic_parsed_options< charT >
parse_config_file(std::basic_istream< charT > &,
const options_description &,
bool allow_unregistered = false);
Таким образом, я изменил свою строку так:
Старый код:
po::store(po::parse_config_file< char >(filePath, options), vm);
Новый код:
po::store(po::parse_config_file< char >(filePath, options, true), vm);
И как я уже сказал, это работает. Спасибо за ваш ответ.