C/C++ Main获取命令行参数

在用 C/C++ 写一些工具时,需要通过命令行传一些参数,这样就可以在命令行终端使用该工具或在脚本中使用该工具,从而实现批量处理。
比如近期需要实现一个对文件进行加解密的工具,我需要通过命令行传递如下参数:

  • 需要处理的输入文件;
  • 处理类型:加密还是解密;
  • 处理多少长度;
  • 输出文件;

1、函数说明

本文采用的短参数,函数定义如下:

#include <unistd.h>  //系统头文件

int getopt(int argc, char * const argv[], const char * optstring);

函数说明:
argc :由 main() 传递的参数个数
argv :由 main() 传递的参数内容
optstring :表示预处理的选项字符串
getopt() 该函数会返回在 argv 中与 optstring 对应的下一个选项字符。
如果找到符合的参数则返回此参数字符, 
如果 optstring 中不包含输入的参数字符则返回 ’?‘ 字符, 
分析结束则返回 -1。
如果 optstring 里的字符后带有冒号 ":",则表示该选项还有相关的参数,可通过 optarg 获取额外参数。
具体用法见下面代码。

2、编码应用

使用代码如下:

#include <iostream>
#include <unistd.h>

using namespace std;

enum OptionType {
    TYPE_UNKNOWN = 0,
    TYPE_ENCRYPT,
    TYPE_DECRYPT
};

/**
 * 文件加解密工具,使用方法如下:
 *
 * ./FileEnDeCryptor -i <InputFile> -t <E/D> -n <Num> -o <OutFile>
 *
 * InputFile :必须参数,需要处理的输入文件
 * E/D       :必须参数,操作类型:加密 E, 解密 D
 * Num       :可选参数,需要处理的数据长度,从文件开始位置计算,如果不设置该参数则处理整个文件
 * OutFile   :可选参数,处理后的输出文件路径,如果不设置则直接在输入文件上操作
 */
int main(int argc, char * argv[]) {

    int opt = 0;
    string input_file;
    string output_file;
    OptionType option_type = TYPE_UNKNOWN;
    int process_num = 0;

    while((opt = getopt(argc, argv, "hi:t:n:o:")) != -1) {
        switch(opt) {
            case 'h':
                printf("Usage: ./FileEnDeCryptor -i <InputFile> -t <E/D> -n <Num> -o <OutFile>\n");
                return 0;
            case 'i':
                input_file = string(optarg);
                break;
            case 'o':
                output_file = string(optarg);
                break;
            case 't':
                if (!strcmp("E", optarg)) {
                    option_type = TYPE_ENCRYPT;
                } else if (!strcmp("D", optarg)) {
                    option_type = TYPE_DECRYPT;
                } else {
                    printf("Error: Option type must be E or D!\n");
                    return -1;
                }
                break;
            case 'n':
                process_num = atoi(optarg);
                break;
        }
    }

    // 参数检查
    if (TYPE_UNKNOWN == option_type)
    {
        printf("Error: Option type must be E or D!\n");
        return -1;
    }
    if (input_file.empty()) {
        printf("Error: Input file path could not be null!\n");
        return -1;
    }
    if (output_file.empty()) {
        output_file = string(input_file);
    }

    printf("input_file = %s, option_type = %d, process_num = %d, output_file = %s\n",
           input_file.c_str(), option_type, process_num, output_file.c_str());

    // TODO Use Args
    return 0;
}

CMakeList.txt

cmake_minimum_required(VERSION 3.6)
project(FileEnDeCryptor)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(FileEnDeCryptor ${SOURCE_FILES})

3、工具编译

cd source (CMakeLists.txt 所在目录)
cmake .
make

在这里插入图片描述

4、测试运行

# 加密全部文件,输入输出为相同文件
./FileEnDeCryptor -i 1.jpg -t E
# 解密全部文件,输入输出为相同文件
./FileEnDeCryptor -i 1.jpg -t D

# 加密全部文件,并输出到新的文件
./FileEnDeCryptor -i 1.jpg -t E -o 1_out.jpg
# 解密全部文件,并输出到新的文件
./FileEnDeCryptor -i 1_out.jpg -t D -o 1_ok.jpg

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章