C / C ++ getopt optstring语法

时间:2012-11-19 05:00:18

标签: c++ c unix command-line-arguments getopt

使用C ++中unistd.h中包含的getopt函数,有没有办法构造optstring,以便......

[-a] [-f "reg_expr"] out_file1 [[-f "reg_expr"] out_file2 ...]可能吗?

这是一项家庭作业,但重点不在于这个特定的子任务。

在我的脑海中,我想指出以下逻辑:

(一个参数),(无限多个带有2个必需(子)参数的f参数),...(无限多个通用参数)

也许我对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 个答案:

答案 0 :(得分: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++;
}