使用getopt
功能包括在C++ unistd.h中,有一個方法來構造optstring使得...C/C++的getopt optstring語法
[-a] [-f "reg_expr"] out_file1 [[-f "reg_expr"] out_file2 ...]
是可能的?
這是一項家庭作業,但重點不在於這個特定的子任務。
在我的頭上,我想說明以下邏輯:
(一個參數),(無限多˚F論點需要2個(次)參數),......(無限多的通用參數)
也許我對getopt
函數的理解是根本上有缺陷的。我還看到一個getopt_long
。也許這就是我想念的。
我最初起草了這個工作,但我碰到了getopt
函數,並認爲它可能會做得更好。
int outFileFlags;
int outFileMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
int i = 1;
while (i < argc){
if (i == 1 && strcmp(argv[i], "-a") == 0){
cout << "append flag set" << endl;
outFileFlags = O_RDWR | O_APPEND;
i++;
continue;
}
else {
outFileFlags = O_TRUNC | O_RDWR | O_CREAT;
}
if (strcmp(argv[i], "-f") == 0 && i+2 <= argc){
cout << " regx = " << argv[i+1] << endl;
cout << " fn = " << argv[i+2] << endl;
i = i+3;
continue;
}
else {
cout << " regx = none" << endl;
cout << " fn = " << argv[i] << endl;
i++;
continue;
}
}
注意:假設這是爲unix環境編寫的。我不認爲我可以使用標準庫中的任何東西。爲了測試目的,我只包含std :: cout。
我很樂意詳細說明任務的任何細節。然而,主要問題圍繞optstring的語法。我目前只知道:意義必要和::意義可選是否有一種方法來指定參數重複像正則表達式通配符*?
編輯:
我敢肯定,這是草率的,由於事實上,我不認爲getopt的設計以處理每個選項多個參數,但它的伎倆......
int main(int argc, char *argv[]){
char c;
int iterations = 0;
while (*argv) {
optind = 1;
if (iterations == 0){
opterr = 0;
c = getopt(argc, argv, "a");
if(c == 'a'){
//~ APPEND SET
}
else if(c=='?'){
optind--;
}
}
while ((c = getopt(argc, argv, "f:")) != -1) {
if (c == 'f'){
//~ REGEX = optarg
if (optind < argc && strcmp(argv[optind], "-f") != 0) {
//~ FILENAME = argv[optind]
optind++;
}
else {
errno = 22;
perror("Error");
exit(errno);
}
}
else {
errno = 22;
perror("Error");
exit(errno);
}
}
argc -= optind;
argv += optind;
iterations++;
//~ REMAINING FILES = *argv
}
}
我認爲這不會與GNU getopt一起使用,它默認重新排列argv向量以允許處理尾隨選項。您可以指定'+'作爲參數說明符的第一個字符,或者設置奇怪命名的環境變量'POSIXLY_CORRECT'來獲得符合Posix的行爲。 – rici
'argc - = optind; argv + = optind; outfile [group_index ++] = * argv; argc--; argv ++;' 我不明白這個部分。你能解釋一下它在做什麼嗎? 此外,我沒有看到optreset在這裏:http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt] 這是什麼? –
在每組選項和輸出文件名之後,它會更新'argv'以指向其餘參數,'argc'是剩餘參數的計數,以便您可以再次調用'getopt'來處理它們。 'getopt'只能理解在文件名之前有所有選項的約定。我寫的只是getopt手冊頁中示例的一個小變體。 – Barmar