【问题标题】:How to use boost program_options to read an integer array?如何使用 boost program_options 读取整数数组?
【发布时间】:2015-01-11 19:27:21
【问题描述】:

我正在使用 Ubuntu 和 boost v1.50。

之前我使用 boost program_options 将一组选项输入到一个程序中,如下所示:

#!/bin/bash

./prog --arg1 1 --arg2 "2" --arg3 {1,2,3} --arg4 {1,2} --arg5 5

所以我正在处理单个整数、字符串和整数数组的混合。 这很好用。

但是,通过在 bash 中引入局部变量来“改进”代码后,我有:

#!/bin/bash
a1=1
a2="2"
a3={1,2,3}
a4={1,2}
a5=5

./prog --arg1 $a1 --arg2 $a2 --arg3 $a3 --arg4 $a4 --arg5 $a5

执行此操作会导致错误:

error: the argument ('{1,2,3}') for option '--arg3' is invalid

我已经像这样设置了 boost program_options:

namespace po = boost::program_options;
using namespace std;
try{
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help", "produce help message")
        ("arg1", po::value<int>(&arg1)->required(), "doc1")
        ("arg2", po::value<string>(&arg2)->default_value("test"), "doc2")
        ("arg3", po::value<vector<int> >(&arg3)->multitoken(), "doc3")
        ("arg4", po::value<vector<int> >(&arg4)->multitoken(), "doc4")
        ("arg5", po::value<int>(&arg5)->default_value(1), "doc5")
        ;

    po::variables_map vm;        
    po::store(po::parse_command_line(ac, av, desc), vm);
    po::notify(vm);    

    if(vm.count("help")) cout << desc << "\n";
}
catch(exception& e){
    cerr << "error: " << e.what() << "\n";
    errorflag=1;
}
catch(...){
    cerr << "Exception of unknown type!\n";
    errorflag=1;
}

我哪里做错了? multitoken 在这种情况下不合适吗?我可以用什么代替?不能读取整数数组吗?

我尝试省略多令牌,但它也失败了。 在 bash 脚本中为局部变量使用引号也无济于事。

如果我将数组输入从 {a,b,c} 更改为“a b c”,就可以了。但是,我已经有大量其他格式的条目,我想继续使用它,因为其他程序也依赖它。

我认为它应该是可行的,因为它在没有局部变量的情况下工作。有人知道怎么做吗?

编辑:我错了。 "a b c" 不能作为输入 :(

编辑 2:我想出了一个解决方法: 我使用

转换 {a,b,c} -> a b c
argnew=`echo ${arg:1:-1} | tr ',' ' '`

并且将其提供给程序可以正常工作。这是最好的解决方案吗?

【问题讨论】:

    标签: c++ linux bash boost-program-options


    【解决方案1】:

    更改您的原始脚本以添加 -x bash 调试选项,如下所示:

    #!/bin/bash -x
    
    ./prog --arg1 1 --arg2 "2" --arg3 {1,2,3} --arg4 {1,2} --arg5 5
    

    然后运行它会显示以下输出:

    + ./prog --arg1 1 --arg2 2 --arg3 1 2 3 --arg4 1 2 --arg5 5
    

    所以你的花括号分组并没有像你认为的那样工作,因为 bash 命令行处理在调用 ./prog 之前会扩展它们。

    如果您将 a3a4 的分配更改为如下所示,则可以在第二个脚本中使其正常工作:

    a3='1 2 3'
    a4='1 2'
    

    然后在您调用 ./prog 时将所有变量双引号:

    ./prog --arg1 "$a1" --arg2 "$a2" --arg3 "$a3" --arg4 "$a4" --arg5 "$a5"
    

    【讨论】:

    • 使用我的小转换技巧(编辑 2),我不需要重写我的数据输入,也不需要引用所有输入变量。但如果没有你的帮助,我不会找到根本原因,所以我接受它作为解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2018-10-18
    • 2011-11-15
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多