說明:本次不使用Qt內(nèi)容,完全使用c++標(biāo)準(zhǔn)來寫
一驯妄、控制臺程序接收荷并、解析參數(shù)
無論控制臺程序也好、還是界面應(yīng)用程序也好青扔,C++的入口函數(shù)就是main函數(shù)源织,所有的執(zhí)行第一個入口函數(shù)。
在main函數(shù)的入?yún)⒅袝в袃蓚€入?yún)?/p>
int main(int nArgc, char *argv[])
第一個參數(shù):數(shù)組的大小微猖,也就是攜帶參數(shù)的個數(shù)
第二個參數(shù):程序執(zhí)行接收到的參數(shù)
當(dāng)執(zhí)行程序沒有攜帶任何參數(shù)的時候谈息,參數(shù)列表默認(rèn)有一個參數(shù),就是本程序*.exe的所在路徑凛剥。
如果你準(zhǔn)備讓這個程序能接收命令參數(shù)的方式執(zhí)行業(yè)務(wù)邏輯侠仇,那么只需要加上對參數(shù)的解析就好了。
接下來實(shí)現(xiàn)一個{ConsoleCMD.exe -r(read) D://CMDText.txt -w(write) D://CMDText2.txt} 這樣命令的例子
1犁珠、首先緩存參數(shù)
vector<string> argvList;
for (int i = 0; i < nArgc; ++i)
{
argvList.push_back(argv[i]);
}
當(dāng)然你也可以使用別的方式逻炊,比如說直接按照參數(shù)順序賦值給結(jié)構(gòu)體或者類成員。不用再次循環(huán)去獲取了犁享;
2余素、解析參數(shù)
最簡單的解析,你也可以根據(jù)你自身的業(yè)務(wù)情況來封裝解析
比如讀取的文件格式的解析與校驗(yàn)炊昆,支持 “-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<string>& argvList)
{
//這里假定只接受5個參數(shù)
int nSize = argvList.size();
if ((1 < nSize && nSize != 5) || nSize > 5)
{
cout << "參數(shù)個數(shù)輸入錯誤!" << endl;
return false;
}
//解析第二個參數(shù)
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;
}
//最后一個參數(shù)為寫入文件桨吊,可以不做解析威根,當(dāng)文件不存在的時候進(jìn)行默認(rèn)的創(chuàng)建
return true;
}
3、控制臺命令main代碼
int main(int nArgc, char* argv[])
{
if (1 < nArgc)//當(dāng)執(zhí)行程序輸入了參數(shù)
{
vector<string> argvList;
for (int i = 0; i < nArgc; ++i)
{
argvList.push_back(argv[i]);
}
if (!parseParam(argvList))
{
cout << "參數(shù)輸入錯誤!" << endl;
return -1;
}
//執(zhí)行任務(wù)
}
//沒參數(shù)輸入的處理.....
return 0;
}
4视乐、頭文件
#include <iostream>
#include <vector>
#include <windows.h>
#include <string>
二医窿、控制臺程序的調(diào)用、調(diào)試
1炊林、控制臺調(diào)用
在ConsoleCMD.exe的目錄下,“shift+右鍵”卷要,選擇“在此處打開命令窗口”
輸入命令:ConsoleCMD.exe -r D://CMDText.txt -w D://CMDText2.txt
2渣聚、代碼調(diào)用
#include <string.h>
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";//注意參數(shù)間的空格
strCMD += strParam;
system(strCMD.c_str());
}
3、調(diào)試控制臺程序
在寫一些較為復(fù)雜的參數(shù)的時候僧叉,難免會需要進(jìn)行調(diào)試奕枝,那么怎么快速進(jìn)入調(diào)試呢?
可以單步調(diào)試瓶堕、可以打日志調(diào)試
我的方式是中斷隘道、附加進(jìn)行調(diào)試
MessageBox(nullptr, L"test", L"test", 0);
在main函數(shù)開始的時候,直接彈出一個對話框郎笆,中斷當(dāng)前進(jìn)程
然后在vs的調(diào)試菜單內(nèi)找到“附加到進(jìn)程”谭梗,打開后選擇控制臺進(jìn)程進(jìn)行調(diào)試。
斷點(diǎn)已中斷
三宛蚓、其他獲取命令的方法
int nArgc = 0;
LPWSTR* argv = nullptr;
LPWSTR pCmdLineW = GetCommandLineW();
argv = CommandLineToArgvW(pCmdLineW, &nArgc);