2013-03-05 2 views
0

у меня есть CFG файл как следующее:Прочитайте один параметр из конфигурационного файла, в котором есть несколько параметров, с усилением program_options

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>(&parameter1)->default_value("bye"), 
    "parameter1") 
    ("parameter2", po::value<int>(&parameter2)->default_value(2), 
    "parameter2") 
    ("parameter3", po::value<int>(&parameter3)->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); 

и переходит к методу getsparameter где это то, что у меня есть на этот раз: ...

po::options_description options("Options"); 
options.add_options() 
    ("help,h", "produce help message") 
    (parameter_string, po::value<int>(&parameter)->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 в том числе, как много линий в качестве параметров, которые я пишу в конфигурационном файле, а затем принять значение из параметра, который я хочу.

ответ

0

Как я использую «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); 

И как я уже сказал, это работает. Спасибо за ваш ответ.

2

Использование allow_unregistered функции:

Указывает, что незарегистрированные параметры могут и должны быть переданы хотя. Для каждой команды, такой как токен, который похож на опцию, но не содержит распознанного имени, экземпляр basic_option будет добавлен к , при этом поле «непризнанное» установлено на «истина». Это можно собрать все непризнанные опции с помощью функции «collect_unrecognized» .

+0

Thank you Geoffroy. Это было именно то, что я искал, и теперь это работает. – user2136529

+1

@ user2136529 Добро пожаловать :) Примите ответ, затем – Geoffroy

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

  • Нет связанных вопросов^_^