2012-11-19 54 views
1

使用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 
    } 
} 

回答

1

您需要爲每組選項和輸出文件名分別設置一個getopt循環。

group_index = 0; 
while (*argv) { 
    optreset = 1; 
    optind = 1; 
    while ((ch = getopt(argc, argv, "af:")) != -1) { 
    switch (ch) { 
     /* process options */ 
    } 
    } 
    argc -= optind; 
    argv += optind; 
    outfile[group_index++] = *argv; 
    argc--; 
    argv++; 
} 
+0

我認爲這不會與GNU getopt一起使用,它默認重新排列argv向量以允許處理尾隨選項。您可以指定'+'作爲參數說明符的第一個字符,或者設置奇怪命名的環境變量'POSIXLY_CORRECT'來獲得符合Posix的行爲。 – rici

+0

'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] 這是什麼? –

+0

在每組選項和輸出文件名之後,它會更新'argv'以指向其餘參數,'argc'是剩餘參數的計數,以便您可以再次調用'getopt'來處理它們。 'getopt'只能理解在文件名之前有所有選項的約定。我寫的只是getopt手冊頁中示例的一個小變體。 – Barmar