C/C++实现无序入参的命令解析工具

C/C++实现无序入参的命令解析工具

  • 1 实现思路
  • 2 主要功能
  • 3 效果展示
    • 3.1 直接运行代码图
    • 3.2help命令执行效果图
    • 3.3命令行执行命令解析效果图
  • 4 代码实现
  • 5 代码下载

1 实现思路

基本介绍: 思路来源于atlas,atc(模型转换工具),该工具对命令支持众多,且命令支持盲录入,支持基本的–help命令查看所有命令参数的解释,因此自己仿照实现,已解决工作当中的通用性工具使用不方便、难以产品化的问题。
atc 工具的应用命令如下:

atc --framework=5 --model=./yolov5l_onnx --input_format=NCHW --input_shape="images:1,3,960,960" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3

下图为atc工具help命令效果:
在这里插入图片描述

2 主要功能

  • 支持跨平台,代码简单,轻松实现移植到linux
  • 支持命令的无序输入
  • 支持 –help 命令查看 ./cmdParser --help
  • 支持错误命令检查告警
  • 支持直接编辑完成命令扩展

3 效果展示

3.1 直接运行代码图

在这里插入图片描述

3.2help命令执行效果图

在这里插入图片描述

3.3命令行执行命令解析效果图

在这里插入图片描述

4 代码实现

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <stdio.h>//命令解析方法
std::map<std::string, std::string> parseCommand(const std::string& command) {std::map<std::string, std::string> parameters;std::istringstream iss(command);std::string token;while (std::getline(iss, token, ' ')) {size_t pos = token.find('=');if (pos != std::string::npos) {std::string key = token.substr(0, pos);std::string value = token.substr(pos + 1);parameters[key] = value;}}return parameters;
}//命令库,直接可以复制编辑
std::map<std::string, std::string> cmdlib = {{"--framework","<number> Specify the framework version"},{"--model","<path> Specify the model file path"},{"--input_format","<format> Specify the input format"},{"--input_shape","<shape> Specify the input shape"},{"--output_type","<type> Specify the output type"},{"--output","<path> Specify the output file path"},{"--log","<level> Specify the log level"},{"--precision_mode","<mode> Specify the precision mode"},{"--soc_version","<version> Specify the SoC version"},{"--help","Display this help and exit"}
};//help展示所有命令
void displayHelp()
{std::cout << "Usage: command [options]\n"<< "Options:\n";for (const auto& p : cmdlib){//命令对齐排版printf("%-30s%-50s\n", p.first.c_str(), p.second.c_str());}
}int main(int argc, char* argv[]) {//解析help命令if (argc == 2 && std::string(argv[1]).find("--help") != std::string::npos) {displayHelp();return 0;}//将所有输入的命令都连成一个字符串std::string command;for (int i = 1; i < argc; ++i) { // Start from 1 to skip the program namecommand += argv[i];if (i < argc - 1) { // Add a space between arguments, but not after the last onecommand += " ";}}std::cout << "The combined command is: " << command << std::endl;//错误 命令测试 command = "--input_shape=\"images:1,3,960,960\" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3  --framework=5 --model=./yolov5l --input_format=NCHW";//正确 测试命令 command = "--input_shape=\"images:1,3,960,960\" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3  --framework=5 --model=./yolov5l --input_format=NCHW";//解析输入的字符串命令auto parameters = parseCommand(command);if (!parameters.empty()){for (const auto& p : parameters){//检查输入的命令是否存在非法命令auto itor = cmdlib.find(p.first);if (itor == cmdlib.end()){std::cerr << "Error: Please Check Invalid command:  " << p.first << std::endl;return 0;}}//打印解析输入命令得到的数据结构for (const auto& p : parameters){std::cout << p.first << " = " << p.second << std::endl;}}return 0;
}

5 代码下载

cmdParser

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/448718.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多…

YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读

YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读 YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读一、前言二、我的环境三、yolov5s.yaml源文件内容四、Parameters五、anchors配置六、backbone七、head八、总结 OLOv5-第Y2周&#xff1a;训练自己的数据集) YOLOv5白皮书-第Y3周:yolov5s.…

获取真实 IP 地址(一):判断是否使用 CDN(附链接)

一、介绍 CDN&#xff0c;全称为内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种网络架构&#xff0c;旨在提高用户对于网络上内容的访问速度和性能。CDN通过在全球各地部署分布式服务器节点来存储和分发静态和动态内容&#xff0c;从而减少…

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑&#xff1a; 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑&#xff1a; 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…

2024牛客寒假训练营1总结

G题不开long long的后果&#xff0c;即使有思路也没用。(给我气的) E题&#xff0c;不看数据范围的后果&#xff0c;不能一题名取题啊。 using ll long long; void solve() {int n, m;std::cin >> n >> m;std::vector<int>a(n);for (int i 0; i < n; i)…

MATLAB矩阵的操作(第二部分)

师从清风 矩阵的创建方法 在MATLAB中&#xff0c;矩阵的创建方法主要有三种&#xff0c;分别是&#xff1a;直接输入法、函数创建法和导入本地文件中的数据。 直接输入法 输入矩阵时要以中括号“[ ]”作为标识符号&#xff0c;矩阵的所有元素必须都在中括号内。 矩阵的同行元…

C语言递归实现数字逆序输出

引言 在计算机编程中&#xff0c;递归是一种强大的工具&#xff0c;它允许函数在其定义内部调用自身。今天&#xff0c;我们将通过一个实例——使用递归函数实现数字的逆序输出&#xff08;如将1234输出为4 3 2 1&#xff09;来深入理解递归的应用和工作原理。 代码展示与解析…

【blender插件】(1)快速开始

特性 blender的python API有如下特性: 编辑用户界面可以编辑的任意数据(场景,网格,粒子等)。修改用户首选项、键映射和主题。运行自己的配置运行工具。创建用户界面元素,如菜单、标题和面板。创建新的工具。场景交互式工具。创建与Blender集成的新渲染引擎。修改模型的数据…

Linux---动静态库

动静态库的相关概念 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

1.27马尔科夫链,抽样蒙特卡洛模拟(逆转化方法,接受拒绝矩阵),马尔科夫链蒙特卡洛MCMC,隐马尔科夫(HMM(V算法剪枝优化),NLP)

马尔科夫链 蒙特卡洛法模拟 抽样&#xff0c;逆转换方法 就是说由系统自带的随机函数RANDOM&#xff0c;通过下面这个方法&#xff0c;可以变为对应的随机模拟函数 就是说要实现蒙特卡洛模拟&#xff0c;是要先有一个概率表达式&#xff0c;然后基于这个概率表达式&#xff0…

Java_简单实现无头单向非循环链表_简单实现LinkedList

文章目录 一、ArrayList的优缺点二、链表1.链表的概念及结构2.链表的分类1、单向或者双向2、带头或者不带头3、循环或者非循环 三、实现无头单向非循环链表1.定义接口2.定义MySingleList3.成员1、节点类&#xff08;定义在MySingList类里&#xff09;2、头节点引用 4.打印链表实…

Docker 容器卷

1、概念介绍 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行为&#xff0c;在SELinux里面挂载目录被禁止掉了&#xff0c;如果要开启&#xff0c;我们一般使用--privlegedtrue命令&#xff0c;扩大…