我有以下程序:
#include <boost/program_options.hpp>
bool check_options(int argc, char** argv)
{
using namespace boost::program_options;
variables_map vm;
// Command line options
std::string cfg_file_name;
options_description cmd_line("Allowed options");
cmd_line.add_options()
("help", "produce this help message")
;
store(parse_command_line(argc, argv, cmd_line), vm);
notify(vm);
if(vm.count("help"))
{
std::cout << cmd_line << std::endl;
return false;
}
return true;
}
int main(int argc, char** argv)
{
if(!check_options(argc, argv))
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,./myprg --help我得到了我期望的结果:
Allowed options:
--help produce this help message
Run Code Online (Sandbox Code Playgroud)
但是,即使我运行:./myprg --hor ./myprg --heor ,我也会得到相同的结果 …
这显然是一个相当简单的问题,因为没有其他人在图书馆遇到过这样的问题。
但是,当我运行我的程序时,boost 返回错误“无法识别的选项 Settings.Directoy”但是我已经在我的代码和我要求它读取的文件中定义了它。首先这是我的代码,很短,因为我是作为测试来做的。
std::string Directory;
try {
ifstream Config_File("Config.ini");
options_description Game("Settings");
Game.add_options()
("Directory", value<std::string>(&Directory)->default_value("Example.exe"));
variables_map vm;
store(parse_config_file(Config_File, Game), vm);
notify(vm);
if (vm.count("Directory"))
{
cout << Directory;
}
}
catch(std::exception& E)
{
std::cout << E.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是它从“Config.ini”中读取的文件
[Settings]
Directory = "Example.exe"
Run Code Online (Sandbox Code Playgroud)
我已经尝试通过更改文件类型、名称...删除空格来调试它?
为目录中的条目添加和删除引号?很多事情,这给了我没有解决方案。
我试图在Linux中解析配置INI文件.我想使用Boost,有人指着我的program options图书馆.
问题是我可以读取具有语法的行field=value,但是如何处理不同的部分,即其中的行[Section_Name]?使用下面的代码我总是有例外
在我试过的代码下面.谢谢AFG
const char* testFileName = "file.ini";
std::ifstream s;
s.open( testFileName );
namespace pod = boost::program_options::detail;
std::set<std::string> options;
options.insert("a");
options.insert("b");
options.insert("c");
//parser
for (pod::config_file_iterator i(s, options), e ; i != e; ++i)
{
std::cout << i->value[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 有什么boost :: program_options就像python的模块一样
我想在打印options_description时在允许的选项描述之前打印一个文本.就像是 :
This program counts from 1 to 10. <--- this is what is missing
Generic options:
-h [ --help ] Produce help message.
-v [ --version ] Show program name/version banner and exit.
Run Code Online (Sandbox Code Playgroud)
目前我手动添加:
if (vm.count("help")) {
cout << "options_description\n\n" << my_options_description << endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
是否可以将其直接存储在options_description对象中?
我想使用boost :: program_options从控制台读取一个整数数组.数组的长度未知,我不想一次尝试读取所有数据.我怎样才能做到这一点?
我现在在做的是
$ ./foo --array"1,2,3"
然后通过拆分输入字符串填充arr [].
但我想要类似的东西
$ ./foo --array 1 --array 2 --array 3
并在arr []中阅读.也想知道arr []的长度,不想让那个命令行参数.
我偶然发现了标题中定义的问题.我有一个应用程序,它创建一个options_description然后使用add_options()它的实例.与示例非常相似:
options_description desc;
desc.add_options()
("help", "produce help")
("optimization", value<int>()->default_value(10), "optimization level")
;
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何修改optimization此调用之后的默认值.这甚至可能吗?文档对我来说似乎很模糊.根据我的理解,这个问题可以推广到任何值语义,就像value_semantic括号中的第二个参数一样.
动机
我觉得这可能是不可能的.所以我想表达我对这种功能的动力.也许我的意图设计是有缺陷的,所以你可以提出别的建议.
我有几个程序执行非常相似的任务,并分享相当多的参数和开关.我以为我可以将公共参数重构为单独的基类.我虽然可以以类似的方式重构命令行解析.boost::program_options我的想法做得很好.我将options_description 实例构造为基类中的私有属性,并在那里添加常用选项.然后在初始化的派生类中,我add_options()再次在此对象上执行添加更多特定选项.这看起来很整洁,我的工作速度非常快.
然后我注意到所有派生类都有一个共同的选项,但它有一个不同的默认值真的很好.即输出文件的名称.对于app1是app1.out,app2 - app2.out等
当然我可以将输出文件名选项移动到add_options派生类中,但它看起来很愚蠢和冗余,因为即使在语义上,除默认值外,一切都是相同的.另一种解决方法是从基类中的默认值和派生类的后解析步骤中退出,检查选项是否已设置并手动应用(默认)值.然而,这似乎也是多余的,因为预期的功能似乎在库本身中实现.
我将尝试提供一个代码示例,以便您可以在以后或请求时更好地感受它.虽然,我认为我的方法很清楚.
编辑 - 代码示例 它是在Rob的回答之后写的,所以我试图保持在命名约定内.
Base - 执行解析并允许将优化级别设置为整数:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
class BaseClass {
public:
BaseClass::BaseClass();
virtual int parse(const int argc, char** argv);
private:
po::options_description m_desc;
po::variables_map vm;
int optimization_level;
};
BaseClass::BaseClass():
m_desc()
{
m_desc.add_options()
("help", "produce help")
("optimization", value<int>()->default_value(10), "optimization …Run Code Online (Sandbox Code Playgroud) 有没有人研究过如何获得boost程序选项来解析不区分大小写的参数列表
在boost文档中,似乎支持它.见http://www.boost.org/doc/libs/1_53_0/boost/program_options/cmdline.hpp
即,设置style_t枚举标志,例如long_case_insensitive.但是,我不知道该怎么做.例如,如何获得以下代码片段来接受--Help或--help或--HELP
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<double>(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if (vm.count("help")) {
cout << desc << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 C++ 应用程序A,它在后台调用另一个应用程序B。一些命令行选项适用于应用程序A,但有些应转发给B。分隔应该使用双破折号--。
例如:
./my_executable_A -a --long_b some_file -- -c --long_d
Run Code Online (Sandbox Code Playgroud)
应该解析{"-a", "--long_b", "some_file"}在应用阿并转发{"-c", "--long_d"}到应用乙当它被称为甲。
我认为boost::program_options用于该任务可能有意义,但我没有找到此功能。这可能吗?
注意:用例是一个libfuse文件系统,其中一些选项将被转发到fuse_main()函数。
我正在和我一起工作boost::program_options.我的程序应该作为任意长度的任意数量的"列表"作为参数(除其他外...).例如,用户应该能够打电话
./myprogram -list item1 item2 item3 -list item1 item2 -list item1 item2
Run Code Online (Sandbox Code Playgroud)
显然,我不希望一个接一个地获得一个列表/向量与所有项目,但是(在这种情况下)三个列表/向量(或者,例如,包含元素的向量的一个向量)每个列表有两个或三个项目(每个项目应该是一个字符串,但我想这没关系).正如我之前所说,列表的数量(以及每个列表的项目数量!)应该是任意的.我怎么能这样做boost::program_options?