我有一个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);
然后转到方法getsparameter,这是我这次有的: ...
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:unknown option parameter1
所以我的问题是,是否可以从文件中只读取一个参数,或者有必要在boost_program
中使用options.add_option
解析所有参数,包括我在配置文件,然后从我想要的参数中获取值。
答案 0 :(得分:2)
使用allow_unregistered
功能:
指定允许并且应该传递未注册的选项 虽然。对于像令牌这样的每个命令看起来像一个选项但是 不包含可识别的名称,basic_option的实例将 添加到结果中,“无法识别”字段设置为“true”。它的 可以收集所有无法识别的选项 'collect_unrecognized'funciton。
答案 1 :(得分: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);
正如我所说,它有效。谢谢你的回答。