如何使用提升program_options读取整数数组
How to use boost program_options to read an integer array?
我正在使用 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
我已经设置了这样的提升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;
}
我哪里做错了?在这种情况下,多令牌不合适吗?我可以使用什么代替?无法读取整数数组吗?
我尝试省略多令牌,但后来也失败了。在 bash 脚本中的局部变量周围使用引号也无济于事。
如果我将数组输入从 {a,b,c} 更改为"a b c",就可以了。但是,我已经有大量其他格式的条目,我想继续使用它,因为其他程序也依赖于它。
我认为它应该是可行的,因为它在没有局部变量的情况下工作。有人知道怎么做吗?
编辑:我错了。"a b c"不能用作输入:(
编辑2:我想出了一些解决方法:我使用 convert {a,b,c} -> a b c
argnew=`echo ${arg:1:-1} | tr ',' ' '`
并且将其馈送到程序工作正常。这是最好的解决方案吗?
更改原始脚本以添加 -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
之前正在扩展它们。
如果在第二个脚本中,如果将a3
和a4
的分配更改为如下所示,则可以使其工作:
a3='1 2 3'
a4='1 2'
然后在调用./prog
时用双引号括起来:
./prog --arg1 "$a1" --arg2 "$a2" --arg3 "$a3" --arg4 "$a4" --arg5 "$a5"
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 一种在C++中读取TXT配置文件的简单方法