baz*_*rek 10 c++ boost getopt-long boost-program-options
我正在开发一个现有程序的更新.我正在用boost :: program_options替换Posix的getopt_long().但是我的工作并没有像我应该的那样工作:我希望阅读如下的论点:
-server=www.example.com
-c config.txt
Run Code Online (Sandbox Code Playgroud)
我尝试了boost :: program_options :: command_line_style的许多可能性,但是我找不到能够使行为等于getopt_long的组合.
我发现了这个论点:
-server=www.example.com
Run Code Online (Sandbox Code Playgroud)
我需要旗帜:
command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent
Run Code Online (Sandbox Code Playgroud)
但我有建立标志的问题:
-c config.txt
Run Code Online (Sandbox Code Playgroud)
我找到了旗帜:
command_line_style::allow_short | command_line_style::allow_dash_for_short | command_line_style::short_allow_next
Run Code Online (Sandbox Code Playgroud)
给我几乎我想要的东西.几乎是因为:
ProgramOptionsParserTest.cpp:107: Failure
Value of: params.config
Actual: " config.txt"
Expected: expectedParams.config
Which is: "config.txt"
Run Code Online (Sandbox Code Playgroud)
所以在使用boost :: algorithm :: trim()后,它将是我想要的.
所以我的问题是:是否可以使用boost :: program_options处理像-c config.txt这样的参数但没有boost :: algorithm :: 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");
Run Code Online (Sandbox Code Playgroud)
但是当我使用未注册的选项时(是的,我有basic_command_line_parser :: allow_unregistered()):
-calibration=something
Run Code Online (Sandbox Code Playgroud)
我知道了:
the argument ('alibration=something') for option '-config' is invalid
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何使用boost :: program_options处理使用getopt_long的参数?
如果您使用boost::program_options,则需要符号“=”才能正确解析参数。如果缺少它会抛出异常。顺便说一下,boost::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;
}
Run Code Online (Sandbox Code Playgroud)
“DEFAULT”是配置文件的部分名称。你可以尝试一下。
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |