在用 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