【问题标题】:Read one parameter from config file where there are more parameters, with boost program_options从配置文件中读取一个参数,其中有更多参数,使用 boost program_options
【发布时间】:2013-03-05 16:33:27
【问题描述】:

我有一个 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>(&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: unknown option parameter1

所以我的问题是是否可以从文件中仅读取一个参数,或者是否有必要使用 boost_program 解析所有参数 options.add_option 包括与我在配置文件中写入的参数一样多的行,然后从我想要的参数中取值。

【问题讨论】:

    标签: c++ parsing configuration-files boost-program-options


    【解决方案1】:

    使用allow_unregistered函数:

    指定允许未注册的选项并且应该通过 尽管。对于每个命令,如令牌,看起来像一个选项,但确实 不包含可识别的名称,basic_option 的实例将 被添加到结果中,“无法识别”字段设置为“真”。它是 可以收集所有无法识别的选项 'collect_unrecognized' 功能。

    【讨论】:

    • 谢谢杰弗里。这正是我一直在寻找的,现在它可以工作了。
    【解决方案2】:

    当我使用“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);
    

    正如我所说,它有效。谢谢你的回答。

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2011-02-02
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多