简介

如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls

ls --all -l --color=auto

这里面包含了三种不同的命令行输入--all-l--color=auto。如果使用一般的解决方法的话,是使用getopt.h文件中的getopt函数。其具体的教程可以看《Linux下getopt()函数的简单使用》,其使用方法比较麻烦。而且只支持一个字符的选项,如果要像--color=auto一样支持长选项,必须再使用getopt_long函数,而且由于其是对C进行支持的,所以在C++中使用起来也比较麻烦。

而Boost提供的Program_options库可以很好的解决这一问题。Program_options提供了一个成熟的C++库来解析命令行参数,几行简单清晰的代码就可以描绘出一个完整的命令行解析器。

而其的使用方法也是非常的简单,大致可以分为三个部分,构建解析器对象,解析命令行参数,使用结果。

使用的时候需要链接boost_program_options库

没有参数的选项

一个非常简单的例子,只定义了一个选项help,运行时会直接先打印获取到的var_mapname,然后检查是否存在help选项,如果存在则打印命令行帮助,如果不存在,就直接推出。

#include <boost/program_options.hpp>
#include <iostream>
#include <string>
#include <vector> int main(int argc, char *argv[]) {
boost::program_options::options_description desc("测试程序"); desc.add_options()("help,h", "打印帮助文档"); boost::program_options::variables_map var_map;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), var_map);
boost::program_options::notify(var_map); for (auto iter : var_map) {
std::cout << iter.first << std::endl;
} if (var_map.count("help") > 0) std::cout << desc << std::endl;
return 0;
}

编译以后运行./main_simple -h或者./main_simple --help可以得到:

help
测试程序:
-h [ --help ] 打印帮助文档

首先是定义了一个boost::program_options::options_description对象,它可以选项列表的描述。它的构造函数可以传入一个字符串,作为打印时候的抬头。

然后是向选项列表里面添加选项,最简单的方法就是使用desc对象里面的add_options方法,它可以返回一个函数对象,借此向选项列表描述添加选项。

目前在这里的选项列表只有简单的两个参数,第一个是表明选项的name,你可以通过用分号将长选项和缩写分割开来,而最终的结果还是以长选项作为name的;第二个是对选项的描述。

然后定义了一个boost::program_options::variables_map对象,它是一个map,key元素为选项的name,value元素为Boost::any对象。

然后开始对命令行输入进行解析,首先使用boost::program_options::parse_command_line进行解析,然后使用boost::program_options::store将结果保存在var_map变量里面。

接下来,就是对map的操作了。而如果想输出说明的话,也可以很直接的直接对desc进行cout

带参数的选项

上面我们介绍了不带参数的简单使用,但是在很多的时候,我们需要通过命令行输入一些参数。就如同最上面例子中的--color=auto一样。Boost提供了非常简单的方法来实现这一操作。

#include <vector>
#include <string>
#include <iostream> #include <boost/program_options.hpp> int main(int argc, char *argv[]) {
boost::program_options::options_description desc("测试程序"); desc.add_options()("help,h", "打印帮助文档");
desc.add_options()("input,i", boost::program_options::value<std::string>()->default_value("Test")->value_name("string"), "输入"); boost::program_options::variables_map var_map;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), var_map);
boost::program_options::notify(var_map); if (var_map.count("help") > 0) std::cout << desc << std::endl;
if (var_map.count("input") > 0) std::cout << var_map["input"].as<std::string>() << std::endl;
return 0;
}

在这个程序中,增加了一行

desc.add_options()("input,i", boost::program_options::value<std::string>()->default_value("Test")->value_name("string"), "输入");

和之前的help选项类似,在这里我们增加了一个input选项,在这个添加过程中,我们向函数对象添加了3个参数,第一个和第三个参数和之前表述的一样。而第二个参数可以看作是对输入的描述。

首先我们通过boost::program_options::value构造了一个对象,在构造的过程中,需要向模板传入一个类型参数,表表明输入值的类型。然后其会构造出一个boost::program_options::type_value类型,可以通过一些方法对其进行设置。

在这一示例中,用户可以在input后面输入一个字符串,同时如果没有输入的话,会主动出现一个默认值Test,这个默认值会在没有输入的时候作为input项的默认值。

然后可以通过对var_map进行简单的操作,来获取输入的值。

其他杂项

很明显,Boost.Program_options的操作肯定还不止这一些,但是以上的简单操作,基本上可以覆盖大部分的使用场景了。然后还有一些使用的小细节。

报错

如果输入的选项中存在描述中没有的选项的话,就会在解析的时候产生一个异常,可以通过捕捉这一个异常,给程序一个更加合理的表现。

隐藏项

如果想给程序增加一个“后门”,只有你知道的选项,应该如何操作呢?

其实很简单,建立两个options_description就好了,一个用来显示,一个用来解析。这样就不会在显示的时候,显示需要隐藏的项了。

转载注明源地址:https://www.cnblogs.com/ink19/p/Boost_Program_options.html

Boost命令行解释器的简单使用:Boost.Program_options的更多相关文章

  1. 命令行解释器(shell)

    unix> ./hello hello world unix> ll 显示当前目录下文件信息. shell为命令行解释器,第一个单词可以是内置的外壳命令,也可以是一个可执行文件名.

  2. 命令行环境下简单实用的工具——重定向&管道

    如果你对管道和重定向应用自如了,无需继续往下看.本文虽然以windows上cmd命令行环境演示,但同样适用于Unix/Linux等平台. 引言 关于管道和重定向,最初是在刘汝佳的<算法竞赛入门经 ...

  3. ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作

    问题导读1.ZooKeeper包含哪些常用命令?2.通过什么命令可以列出服务器 watch 的详细信息?3.ZooKeeper包含哪些操作?4.ZooKeeper如何创建zookeeper? 常用命令 ...

  4. Linux命令行及Vim简单学习记录

    Linux命令行 1.打开命令行 Ctrl+Alt+t 2.目录 显示当前目录的文件列表 ls 跳转至当前目录中的x文件夹 cd x 返回根目录 cd 3.文件 新建文件1.cpp touch ./1 ...

  5. zk 06之:ZooKeeper命令、命令行工具及简单操作

    常用命令ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 ZooK ...

  6. python命令行解释器 argparse

    一: argparse介绍 1.  argparse argparse,它是Python标准库中推荐使用的编写命令行程序的工具 parser = argparse.ArgumentParser()  ...

  7. 使用Linux的命令行工具做简单的文本分析

    Basic Text Analysis with Command Line Tools in Linux | William J Turkel 这篇文章非常清楚的介绍了如何使用Linux的命令行工具进 ...

  8. Git教程(3)命令行使用git简单示例

    基础 Git系统下的的文件有3种状态: 已修改(modified):已修改表示修改了文件,但还没保存到数据库中. 已暂存(staged) : 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下 ...

  9. Linux 下五个顶级的开源命令行 Shell

    这个世界上有两种 Linux 用户:敢于冒险的和态度谨慎的. 其中一类用户总是本能的去尝试任何能够戳中其痛点的新选择.他们尝试过不计其数的窗口管理器.系统发行版和几乎所有能找到的桌面插件. 另一类用户 ...

随机推荐

  1. 【树形DP】BZOJ 1131 Sta

    题目内容 给出一个\(N\)个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入格式 给出一个数字\(N\),代表有\(N\)个点.\(N \le 1000000\).下面\(N-1 ...

  2. go正则

    package main import ( "fmt" "regexp" ) func main() { context1 := "3.14 1231 ...

  3. Tomcat6.0 支持 https

    环境信息 Linux系统 + Tomcat  (程序页面可以运行前提下) 条件:安装了JDK 查看指定版本信息 1 进入$JAVA_HOME/bin目录     (一般是这个目录  /usr/java ...

  4. mybatis-plus自动填充

    1,给字段添加注解 @TableField(value = "create_time", fill = FieldFill.INSERT) 2,添加填充处理器,需要实现接口Meta ...

  5. Paillier同态加密的介绍以及c++实现

    我们先来简短认识一下Paillier同态加密算法: 如果就这么按照定义来用最简朴的c++程序写 就像这样: #include <iostream> #include <math.h& ...

  6. paraview将csv格式显示为云图

    paraview可以直接读入csv数据,并且显示为vtk的云图效果,和矢量图效果. 二维矢量图 导入csv数据(数据在文章最后有提供): 成功导入: 关闭右侧数据,并选择Filters->Alp ...

  7. H5页面 用户启动无痕浏览本地储存 localstorage 清楚数据

    移动端开发时,如果用户浏览器启用了无痕浏览,那么本地存储信息就会失效,会导致页面信息报错 解决办法: 先判断是否能适用 localStorage.setItem 如果不行在适用  cookie coo ...

  8. 【Aspose.Words for Java】 对word文档,增加页眉,页脚,插入内容区图像,

    一.环境准备 jar包:aspose-words-20.4.jar 或者去官方网站下载: 官方网站:https://www.aspose.com/ 下载地址:https://downloads.asp ...

  9. 关于oracle监听程序的相关问题及解决方法

    1.查看监听程序是否启动 打开cmd窗口,cmd用管理员运行,否则无法执行启动与停止监听命令 lsnrctl status查看运行状态 lsnrctl stop停止监听 lsnrctl start启动 ...

  10. 面试时说Redis是单线程的,被喷惨了!

    Redis是单线程的,这话搁以前,是横着走的,谁都知道的真理.现在不一样,Redis 变了.再说这句话,多少得有质疑的语气来跟你辩驳一番.意志不坚定的,可能就缴械投降,顺着别人走了. 到底是什么样的, ...