我有點晚與此聚會,但我會提供更新的答案。實際上,您可以使用'getopt'在C++中獲得所需的功能。使用getopt_long()
,您可以創建單個字符選項(如-c
)或命名選項(如--input
)。您也可以使用getopt_long_only()
,這將允許您只通過一個短劃線來傳遞命名選項。例如參見here或this answer。
例
這裏是要做到你想要做什麼的例子:
#include <iostream>
#include <getopt.h>
#include <map>
#include <string>
int main (int argc, char** argv)
{
// Create the variables to store your parameters
std::map<std::string, std::string> input_parameters ;
input_parameters["input"] = "default_in" ; // Storage for input
input_parameters["output"] = "default_out" ; // Storage for output
// Create variables to hold your parameters
const struct option longopts[] =
{
{"input", required_argument, 0, 'i'},
{"output", required_argument, 0, 'o'},
{0,0,0,0} // This tells getopt that this is the end
};
// Some parameters for getopt_long
int c(0);
// Get the options from the command line
while (c != -1) {
int option_index(-1) ;
// Read the next command line option
// Note here that the ':' after the 'i' and 'o' denotes that
// it requires an argument
c = getopt_long(argc, argv, "i:o:", longopts, &option_index) ;
// If the option is valid, fill the corresponding value
if ((c>0)&&(option_index>=0)) {
std::cout << option_index << std::endl;
input_parameters[longopts[option_index].name] = optarg ;
}
switch (c) {
case 'i':
// Fill input option
input_parameters["input"] = optarg ;
case 'o':
// Fill output option
input_parameters["output"] = optarg ;
case '?':
// getopt_long printed an error message
break ;
}
}
std::cout << "input = " << input_parameters["input"] << std::endl;
std::cout << "output = " << input_parameters["output"] << std::endl;
return 0 ;
}
注意,在這裏,你可以運行這個離開之間的空間參數和你想傳遞給它的值。這將產生如下:
$ ./myscript --input inputfile.txt --output outputfile.txt
input = inputfile.txt
output = outputfile.txt
或
$ ./myscript -i inputfile.txt -o outpufile.txt
input = inputfile.txt
output = outputfile.txt
您還可以使用--input
和-i
互換(用--output
和-o
下同)。
開始無恥插頭(即圍繞getopt的建立了自己的CLOptions代碼)
我其實有點不滿與工作量也採取了與參數,可能是得到的getopt的完全成熟的功能boolean,double,int或string。我還必須在每個項目中創建一個全新的實現!所以,我把一個名爲「CLOptions」的快速課放在一起,這樣我就可以在我的代碼中使用#include "CLOptions.h"
(一切都在一個文件中),現在我只需要一行來定義每個附加選項。它還會創建-h
或-help
選項來爲您打印幫助信息!它包括根據您定義每個參數的方式將每個參數作爲bool,double,int或字符串獲取的功能。你可以在GitHub here上看看它,例如how the above method could be implemented。請注意,該類是C++ 11,編譯時需要-std=c++11
(但如果有人問,我可以嘗試編寫C版本)。
雖然我還沒有嘗試過,但還有一些其他人爲解決此問題而設計的其他命令行程序(例如options或dropt)。你大概可以通過使用Google搜索來找到它們。
謝謝。這非常有幫助。 U'r da man:D – 2011-01-24 11:33:41