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 name
        command += argv[i];
        if (i < argc - 1) { // Add a space between arguments, but not after the last one
            command += " ";
        }
    }
    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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 导入图片时,如何自动设置格式

AssetPostprocessor是Unity中的一个强大工具&#xff0c;它允许您控制在导入资源时发生的事情。它主要被用来处理在导入或重新导入资源时自定义编程操作的需求。 AssetPostprocessor的主要作用&#xff1a; 1. 自定义资源导入设置&#xff1a;可以自定义图片&#xff0c;模型&…

TensorFlow2实战-系列教程4:数据增强

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 猫狗识别1 数据增强 猫狗识别2------数据增强 猫狗识别3------迁移学习 对于图像数据…

微信公众号在线客服源码系统,开发组合PHP+MySQL 带完整的安装代码包以及搭建教程

移动互联网的快速发展&#xff0c;微信公众号成为了企业与用户之间的重要沟通桥梁。为了满足企业对微信公众号在线客服的需求&#xff0c;小编给大家分享一款基于PHP和MySQL的微信公众号在线客服源码系统。这套系统能够帮助企业快速搭建自己的微信公众号在线客服平台&#xff0…

构建中国人自己的私人GPT—支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…

AVR 328pb定时器0基本介绍和使用

AVR 328pb定时器0基本介绍和使用 &#x1f4cc;参考ATmega328PB文档.&#x1f4cd;结合参考同架构lgt8f328p中文文档&#xff1a;http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf &#x1f4d7;定时器0基本功能描述 两个独立的输出比较…

【Web前端实操21】商城官网_白色导航

今日份实现白色导航栏部分&#xff0c;也就是第三部分&#xff0c;效果如图中划线所示&#xff1a; 本次实现代码如之前的全局样式不再赘述&#xff0c;如有需要可以去我博客的Web前端实操19或者20自行查看。 本次主要更新mi.css和index.htm。 实现导航栏所需要的CSS样…

Handler 消息机制

1. 概述 Android 的消息机制主要是指 Handler 的运行机制&#xff0c;以及 Handler 所附带的 MessageQueue 和 Looper 的工作过程。 Handler、MessageQueue、Looper 这三者实际上是一个整体&#xff0c;只不过在开发过程中比较多地接触 Handler 而已。 Handler 的主要作用是将…

Redis单机-主从集群-哨兵集群-分片集群 搭建教程

Redis集群 本章是基于CentOS7下的Redis集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tclredis-6.2.4.tar.gz 然后将Redis安装包上传到虚拟机的任意目录&am…

Python编程实验一:流程控制结构

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 第3题 第4题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握多分支语句 if …elif…else结构的用法&#xff1b; &…

丰富福利等你来拿!第七届世界智能大会·中国华录杯数据湖算法大赛开启招募!

由天津市委网信办、天津市工业和信息化局、天津市津南区人民政府主办&#xff0c;北京易华录信息技术股份有限公司、天津华易智诚科技发展有限公司承办的“第七届世界智能大会中国华录杯数据湖算法大赛”开启招募。 本次大赛紧紧围绕数据“收、存、治、用、易”为理念&#xf…

低码大前端 - 混合云集群部署 PagePlug

前情提要 老师之前布置了什么作业&#xff0c;完全忘了&#xff0c;本来觉得写作业可能也就一两个小时的事情&#xff0c;结果搞了半天&#xff0c;有一半的作业题目都没找到&#xff0c;mmp, 之前拖延症&#xff0c;搞到心态都炸了&#xff0c;今天不管怎么说都要搞定&#x…

Redis核心技术与实战【学习笔记】 - 9.如何避免单线程模型的阻塞

概述 Redis 被广泛应用的原因是因为它支持高性能访问。所以&#xff0c;我们要重视所有可能影响 Redis 性能的因素&#xff08;如命令操作、系统配置、关键机制、硬件配置等&#xff09;。 影响 Redis 性能的 5 大方面的潜在因素分别是&#xff1a; Redis 内部的阻塞式操作C…

测试大佬是怎么看待测试用例设计的

前言 最近干的最多的事情就是设计测试用例、评审测试用例了&#xff0c;于是我不禁又想到了一个经典的问题&#xff1a;如何设计出优秀的测试用例&#xff1f; 可能有些童鞋看到这个问题会有些不以为然&#xff0c;这有什么好想的&#xff1f;干个测试谁还不会设计测试用例&…

41、WEB攻防——通用漏洞XMLXXE无回显DTD实体伪协议代码审计

文章目录 XXE原理&探针&利用XXE读取文件XXE带外测试XXE实体引用XXE挖掘XXE修复 参考资料&#xff1a;CTF XXE XXE原理&探针&利用 XXE用到的重点知识是XML&#xff0c;XML被设计为传输和存储数据&#xff0c;XML文档结构包括XML声明、DTD文档类型定义&#xf…

XVC767AE102 3BHB007209R0102

XVC767AE102 3BHB007209R0102 XVC767AE102 3BHB007209R0102 GPS99808模块在汽车防盗系统中的应用 ... 详细介绍了 leadtek公司最新款oem模块gps9808在新型智能防盗系统中的 ... 定位模块、cpu控制模块、gps通信模块、传感器检测模块、声光报警模块、电源管理模块 ... 功能…

k8s之基础组件说明

前言 K8S&#xff0c;全称 Kubernetes&#xff0c;是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序&#xff0c;并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。 具体来说&#xff0c;Kubernetes 可以将应用程序打包成…

sqli-labs-master靶场训练笔记(1-22|新手村)

2024.1.21 level-1 &#xff08;单引号装饰&#xff09; 先根据提示建立一个get请求 在尝试使用单个单引号测试&#xff0c;成功发现语句未闭合报错 然后反手一个 order by 得到数据库共3列&#xff0c;-- 后面加字母防止浏览器吃掉 -- 操作&#xff08;有些会&#xff09…

全链路压测的关键点是什么?

全链路压测是一种重要的性能测试方法&#xff0c;用于评估应用程序或系统在真实生产环境下的性能表现。通过模拟真实用户行为和流量&#xff0c;全链路压测能够全面评估系统在不同负载下的稳定性和性能表现。本文将介绍全链路压测的关键点&#xff0c;以帮助企业更好地理解和应…

IT行业证书大揭秘:哪些证书含金量最高?

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f4d2; 证书 &#x1f4d2; &#x1f4d6; 介绍 &#x1f4d6; 在IT行业&#xff0c;有许多证书被认为是含金量高的&#xff0c;可以帮助个人在职业发展中取得重要的竞争优势。以下是一些IT行业中被认为含金量高的证书&#x…

Docker基础知识

1、什么是Docker&#xff1f;Docker解决了什么问题 一个项目中&#xff0c;部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等&#xff0c;这些服务部署时所需要的函数库、依赖项各不相同&#xff0c;甚至会有冲突。给部署带来了极大的困难。 所以引入了Docker Docker为了…