执行程序时,经常会用到命令行参数传递参数这种方式,今天实战一个命令行参数的从头到尾。 先写个主函数 接下来写解析函数 记录一下program options的用法 组件: 最后一步: –username tom –password 123 –host 192.168.1.1 –port 9090 –itemID 987654321 –filePath G:file 转载注明出处:https://blog.csdn.net/W96866/article/details/106060351
博文虽长,但均为干货。#include<iostream> int main(const int argc, const char* argv[]) //argc和argv的类型不一样, { try{ const auto po = translateParams(argc,argv); //解析函数。先写这,等会在声明实现。 } }
program options是一系列pair<name,value>组成的选项列表,它允许程序通过命令行或配置文件来读取这些参数选项.
1.options_description(选项描述器):描述当前程序定义了哪些选项
2.parse_command_line(选项分析器):解析命令行输入的参数
3.variables_map(选项存储器):容器,用于存储解析后的选项 #include<iostream> #include<boost/program_options.hpp> using namespace boost::filesystem; //定义一个数据库的枚举 enum DataSourceType { ORACLE, //oracle类型的数据库 SQLSERVER //sqlserver类型的数据库 }; //定义一个解析结果类型,这里写一个结构体 struct ProgramOptions { std::wstring name; std::wstring pass; std::wstring host; std::wstring port; std::wstring itemID; std::wstring filePath; } //解析函数的实现 ProgramOptions translateParams(int argc, char* argv[]) { //boost c++ libraries提供了programoption;上面有该命名空间的三个组件说明 using namespace boost::program_options; //定义选项描述器(组件1) options_description bOptions("main Options") //给描述器起个名字,叫“main Options” //添加当前程序定义的选项 //add_Options函数,重载了()操作符; operator()(const char* name, const value_semantic* s, const char* description); /* //wvalue是个模板函数 template<class T> typed_value<T, wchar_t>* wvalue() { return wvalue<T>(0); }*/ { bOptions.add_Option() ("username", wvalue<std::wstring>(), "username [string]") ("password", wvalue<std::wstring>(), "password[string]") ("host", wvalue<std::wstring>(), "host[string]") ("port", wvalue<std::wstring>(), "port[string]") ("itemID", wvalue<std::wstring>(), "root_item_ID [string]") ("filePath", wvalue<std::wstring>(), "...") ; } //定义一个选项存储器(组件3),存储解析的参数。 variables_map poMap; //描述了需要解析的参数,并且有了存储器。所以,接下来需要存放agrc和argv中的数据了。 try { /* parse_command_line函数的源码 template<class charT> basic_parsed_options<charT> parse_command_line(int argc, const charT* const argv[], , const options_description& desc , int style , function1<std::pair<std::string, std::string> , const std::string&> ext) { return basic_command_line_parser<charT>(argc, argv).options(desc). style(style).extra_parser(ext).run(); }*/ //从argc, argv中获取命令行参数,和bOptions的选项对应起来。最后保存到poMap变量中。 //当然,store函数是variables_map提供的方法。 store(boost::program_options::parse_command_line(argc, argv, bOptions), poMap) } catch(...) { throw std::exception("parameter command Error!"); //命令行参数有错时捕获错误,类型一般都是自定义的 } notify(poMap);//notify在这的作用暂且不详 //判断一下poMap中获取到的命名行参数的个数是否正确(我们描述器中描述了6个参数) if(poMap.size() != 6) { throw("parameter number Error!"); //个数不对跑错。 } //个数正确,到这儿就该返回解析的参数了。目前解析出来的参数通过store函数存放在poMap中,所以从该变量中拿值 ProgramOptions pO; pO.name = poMap["name"].as<std::string>(); //as是个模板函数,类型为string,()表示函数执行 pO.pass = poMap["pass"].as<std::string>(); pO.port = poMap["port"].as<std::string>(); pO.host = poMap["host"].as<std::string>(); pO.itemID = poMap["itemID"].as<std::string>(); pO.filePath = poMap["filePath"].as<std::string>(); return pO; } //main函数本身就有argc和argv两个参数,就是用来处理命令行参数的。 int main(const int argc, const char* argv[]) //argc和argv的类型不一样, { try { const auto po = translateParams(argc,argv); //解析命令行参数。 //使用po,举例如下: path filePath = po.filePath; } catch(const std::exception& e) { //处理错误。 } return 1; }
命令行参数的使用。
①如果是在开发时使用,直接属性栏中输入参数即可。如下图:
注意:6个参数,参数名字和bOptions(选项描述器)中添加的选项名一样。
②当你直接执行Bin中工程的exe时:如下图。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算