标签: boost-program-options

为什么 boost::program_options 接受截断的单词?

我有以下程序:

#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 ,我也会得到相同的结果 …

c++ boost boost-program-options

3
推荐指数
1
解决办法
438
查看次数

如何使用 boost 程序选项配置文件中的部分

这显然是一个相当简单的问题,因为没有其他人在图书馆遇到过这样的问题。

但是,当我运行我的程序时,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)

我已经尝试通过更改文件类型、名称...删除空格来调试它?

为目录中的条目添加和删除引号?很多事情,这给了我没有解决方案。

c++ boost file boost-program-options

3
推荐指数
1
解决办法
5415
查看次数

使用Boost.Program_options处理INI文件的各个部分

我试图在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)

c++ ini configuration-files boost-program-options

2
推荐指数
2
解决办法
7639
查看次数

2
推荐指数
1
解决办法
348
查看次数

boost :: program_options:如何添加程序描述文本

我想在打印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对象中?

c++ boost-program-options

2
推荐指数
1
解决办法
1102
查看次数

boost :: program_options从控制台读取一个整数数组

我想使用boost :: program_options从控制台读取一个整数数组.数组的长度未知,我不想一次尝试读取所有数据.我怎样才能做到这一点?

我现在在做的是

$ ./foo --array"1,2,3"

然后通过拆分输入字符串填充arr [].

但我想要类似的东西

$ ./foo --array 1 --array 2 --array 3

并在arr []中阅读.也想知道arr []的长度,不想让那个命令行参数.

c++ boost boost-program-options

2
推荐指数
1
解决办法
963
查看次数

在add_options()之后更改boost :: program_options中的值语义.即默认值

我偶然发现了标题中定义的问题.我有一个应用程序,它创建一个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)

c++ boost boost-program-options

2
推荐指数
1
解决办法
1813
查看次数

boost program_option不区分大小写的解析

有没有人研究过如何获得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++ boost boost-program-options

2
推荐指数
1
解决办法
965
查看次数

Boost.Program_options:将“--”后的参数转发到另一个程序

我正在编写一个 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()函数。

c++ boost getopt boost-program-options

2
推荐指数
1
解决办法
379
查看次数

C++:Boost program_options:多个参数列表

我正在和我一起工作boost::program_options.我的程序应该作为任意长度的任意数量的"列表"作为参数(除其他外...).例如,用户应该能够打电话

./myprogram -list item1 item2 item3 -list item1 item2 -list item1 item2
Run Code Online (Sandbox Code Playgroud)

显然,我不希望一个接一个地获得一个列表/向量与所有项目,但是(在这种情况下)三个列表/向量(或者,例如,包含元素的向量的一个向量)每个列表有两个或三个项目(每个项目应该是一个字符串,但我想这没关系).正如我之前所说,列表的数量(以及每个列表的项目数量!)应该是任意的.我怎么能这样做boost::program_options

c++ boost boost-program-options

2
推荐指数
1
解决办法
1041
查看次数