我正在使用boost :: program_options库来处理命令行参数.我需要通过-r选项接受文件名,万一它是空的(-r没有params)我需要使用stdin.
desc.add_options()
("replay,r", boost::program_options::value<std::string>(), "bla bla bla")
Run Code Online (Sandbox Code Playgroud)
在这种情况下,boost不会接受-r而没有params并抛出异常.default_value()选项不起作用,即使用户没有给出-r选项,它也会使库返回值.
任何想法如何解决?
很简单的例子:
#include <string>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char* argv[])
{
po::options_description recipients("Recipient(s)");
recipients.add_options()
("csv", po::value<std::string>(), "" )
("csv_name", po::value<unsigned>(), "" )
;
po::options_description cmdline_options;
cmdline_options.add(recipients);
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(cmdline_options).run(), vm);
po::notify(vm);
return 0;
}
还有一些测试:
>Test --csv test
in option 'csv_name': invalid option value
>Test --csv_name test
in option 'csv_name': invalid option value
>Test --csv_name 0
>Test --csv text
in option 'csv_name': invalid option value
>Test --csv 0
>Test --csv_name 0
>Test --csv_name 0 --csv …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种在C++中存储程序设置或选项或配置的解决方案.这些可能是在GUI中公开的设置,需要在我的代码运行之间保存.
在我的搜索中,我遇到了boost.PropertyTree,这似乎是一个不错的选择.我知道boost是备受推崇的代码,所以我很习惯使用它,所以我开始使用它开发.然后我遇到了boost.program_options,它似乎允许你做同样的事情,但也看起来更专业的程序设置的具体用例.
现在我想知道哪个最适合这份工作?(或者是第三种选择比两者都好)
编辑: fyi这是一个插件,所以它不会使用命令行选项(因为,甚至不可能).
UPDATE
我最后坚持使用boost.PropertyTree.我需要能够将更改的选项保存回INI,并且我没有看到使用boost.program_options执行此操作的方法.
c++ configuration boost boost-program-options boost-propertytree
我想为代码中的注释提供位置参数的默认值,但编译器会抱怨.这个代码编译得很好.我使用boost 1.46.1和g ++
int main(int argc, char *argv[]) {
namespace po = boost::program_options;
po::positional_options_description p;
p.add("path", -1);
po::options_description desc("Options");
std::vector<std::string> vec_str;
std::string str;
desc.add_options()
("foo,f", po::value< std::string >()->default_value(str), "bar")
//("path,p", po::value< std::vector<std::string> >()->default_value(vec_str), "input files.")
("path,p", po::value< std::vector<std::string> >(), "input files.")
;
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
po::notify(vm);
}
Run Code Online (Sandbox Code Playgroud) 我想用正值或负值传递多个参数.有可能解析它吗?
目前我有一个以下初始化:
vector<int> IDlist;
namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
("help","print help")
;
Run Code Online (Sandbox Code Playgroud)
我想打个电话:
./test_ids.x --IDlist=0 1 200 -2
unknown option -2
Run Code Online (Sandbox Code Playgroud)
因此,program_options假定我传递-2作为另一个选项.
我可以以能够接受负整数值的方式配置program_options吗?
谢谢阿曼.
编辑: BTW我正在通过简单的解析器解析它
store(command_line_parser(argc, argv).options(commands).run(), vm);
Run Code Online (Sandbox Code Playgroud)
,但解决方案是使用扩展的:
parse_command_line
Run Code Online (Sandbox Code Playgroud) 考虑从boost程序选项示例中采用的以下简单程序
#include <boost/program_options.hpp>
#include <boost/version.hpp>
#include <iostream>
int
main( int argc, char** argv )
{
namespace po = boost::program_options;
po::options_description desc("Options");
unsigned foo;
desc.add_options()
("help,h", "produce help message")
("foo", po::value(&foo), "set foo")
;
po::variables_map vm;
try {
po::store(
po::parse_command_line( argc, argv, desc ),
vm
);
po::notify( vm );
if ( vm.count("help") ) {
std::cout << desc << "\n";
std::cout << "boost version: " << BOOST_LIB_VERSION << std::endl;
}
} catch ( const boost::program_options::error& e ) {
std::cerr << …Run Code Online (Sandbox Code Playgroud) 我正在使用Boost程序选项,我想提供一个有三种方式的选项:
例如,我有一个程序可以处理a.jpg等文件,我想让用户能够在以下场景中使用它:
myapp.exe a.jpg : process jpeg
myapp.exe a.jpg -e : process jpeg and generate report at the same directory as a.jpg
myapp.exe a.jpg -e c:\tmp\ : process jpeg and generate report at c:\tmp\
Run Code Online (Sandbox Code Playgroud)
如何使用Boost程序选项执行此操作?
一些boost库只是标题库,有些不是,并且由于各种原因等.
是否有特定的原因/设计决定为什么Boost.ProgramOptions不是标题?
我想知道因为它声称它的文档中是一个"小"库,我没有看到任何与系统相关的原因(如线程或asio).
使用boost:program_options进行命令行解析时遇到问题.解释它的最快方法是显示代码:
const std::vector<tstring> args;
if (ac > 0 && NULL!=av) //ac is a ULONG
{
for (int i = 0; i < ac; i++)
{
args.push_back(av[i]); //av is an LPTSTR pointer (pointer to TCHAR*)
}
}
po::command_line_parser parser(args);
Run Code Online (Sandbox Code Playgroud)
解析器ctor应该采用const std :: vector <charT>
typedef basic_command_line_parser<char> command_line_parser;
typedef basic_command_line_parser<wchar_t> wcommand_line_parser;
/** Creates instance of 'command_line_parser', passes parameters to it,
and returns the result of calling the 'run' method.
*/
template<class charT>
class basic_command_line_parser : private detail::cmdline {
public:
/** Creates a …Run Code Online (Sandbox Code Playgroud) 我正在开发一个现有程序的更新.我正在用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 …Run Code Online (Sandbox Code Playgroud)