说明:本次不使用Qt内容,完全使用c++标准来写
一、控制台程序接收、解析参数
无论控制台程序也好、还是界面应用程序也好,C++的入口函数就是main函数,所有的执行第一个入口函数。
在main函数的入参中会带有两个入参
int main(int nArgc, char *argv[])
第一个参数:数组的大小,也就是携带参数的个数
第二个参数:程序执行接收到的参数
当执行程序没有携带任何参数的时候,参数列表默认有一个参数,就是本程序*.exe的所在路径。
如果你准备让这个程序能接收命令参数的方式执行业务逻辑,那么只需要加上对参数的解析就好了。
接下来实现一个{ConsoleCMD.exe -r(read) D://CMDText.txt -w(write) D://CMDText2.txt} 这样命令的例子
1、首先缓存参数
vector argvList;
for (int i = 0; i < nArgc; ++i)
{
argvList.push_back(argv[i]);
}
当然你也可以使用别的方式,比如说直接按照参数顺序赋值给结构体或者类成员。不用再次循环去获取了;
2、解析参数
最简单的解析,你也可以根据你自身的业务情况来封装解析
比如读取的文件格式的解析与校验,支持 “-help” “-version”
以及 -r -w 解析空白字符等等
bool checkPath(const string& strFile)
{
LPWIN32_FIND_DATAA FindFileData = new _WIN32_FIND_DATAA();
HANDLE hFind = 0;
LPCSTR text = strFile.c_str();
hFind = FindFirstFileA(text, FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
delete FindFileData;
return false;
}
delete FindFileData;
return true;
}
bool parseParam(const vector& argvList)
{
//这里假定只接受5个参数
int nSize = argvList.size();
if ((1 < nSize && nSize != 5) || nSize > 5)
{
cout << "参数个数输入错误!" << endl;
return false;
}
//解析第二个参数
if ("-r" != argvList[1] && "-R" != argvList[1])
{
return false;
}
if (!checkPath(argvList[2]))
{
cout << "找不到" << argvList[2] << "该路径下的文件!" << endl;
return false;
}
if ("-w" != argvList[3] && "-W" != argvList[3])
{
return false;
}
//最后一个参数为写入文件,可以不做解析,当文件不存在的时候进行默认的创建
return true;
}
3、控制台命令main代码
int main(int nArgc, char* argv[])
{
if (1 < nArgc)//当执行程序输入了参数
{
vector argvList;
for (int i = 0; i < nArgc; ++i)
{
argvList.push_back(argv[i]);
}
if (!parseParam(argvList))
{
cout << "参数输入错误!" << endl;
return -1;
}
//执行任务
}
//没参数输入的处理.....
return 0;
}
4、头文件
#include
#include
#include
#include
二、控制台程序的调用、调试
1、控制台调用
在ConsoleCMD.exe的目录下,“shift+右键”,选择“在此处打开命令窗口”
输入命令:ConsoleCMD.exe -r D://CMDText.txt -w D://CMDText2.txt
2、代码调用
#include
using namespace std;
int main()
{
string strCMD = "E://work//c++_Project//ConsoleCMD//Debug//ConsoleCMD.exe";
string strParam = " -r D://CMDText.txt -w D://CMDText2.txt";//注意参数间的空格
strCMD += strParam;
system(strCMD.c_str());
}
3、调试控制台程序
在写一些较为复杂的参数的时候,难免会需要进行调试,那么怎么快速进入调试呢?
可以单步调试、可以打日志调试
我的方式是中断、附加进行调试
MessageBox(nullptr, L"test", L"test", 0);
在main函数开始的时候,直接弹出一个对话框,中断当前进程
然后在vs的调试菜单内找到“附加到进程”,打开后选择控制台进程进行调试。
断点已中断
三、其他获取命令的方法
int nArgc = 0;
LPWSTR* argv = nullptr;
LPWSTR pCmdLineW = GetCommandLineW();
argv = CommandLineToArgvW(pCmdLineW, &nArgc);