getopt用法(带/不带选项)

时间:2019-03-07 12:57:32

标签: c arguments command-line-arguments getopt argp

我正在使用import csv def parts(logfile): with open(logfile, newline='') as f: reader = csv.reader(f) files = [column for row in reader for column in row if column] fcount = len(files) storage = 0 for i, filename in enumerate(files): storage += os.path.getsize(file) if storage >= 2500000: input("Please close some files to continue, then press ENTER") storage = 0 print(f'Auslastung: {storage} bite / 2500000 bite') yield file print(f'Fortschritt: {i} / {fcount} ({i / fcount:.2%}) - {name}') 参数编写一个简单的代码。我想知道是否可以将for file in parts('C:/Users/user/Desktop/log.txt'): oDoc = oApp.Documents.Open(file) 函数用于以下用途。

*argv[]

该程序可以仅采用getopt()(例如./myprogram -a PATH ./myprogram PATH ),也可以采用PATH之外的其他方式/usr/tmp-a可以用于此状态吗?如果可以,怎么办?

2 个答案:

答案 0 :(得分:3)

  

该程序可以仅采用PATH(例如/usr/tmp),也可以采用PATH之外的其他选项。 getopt()可以用于此状态吗?如果可以,怎么办?

当然。我不确定您在哪里看到了潜在的问题,除非您不理解POSIX和getopt() options arguments 之间的区别。它们是相关的,但并非完全相同。

getopt()很好,因为实际上没有指定任何选项,它使您可以访问非选项参数,例如PATH似乎适合您,无论有多少个选项已指定。通常的用法模型是循环调用getopt(),直到返回-1,以指示命令行中没有更多选项可用。在每个步骤中,全局变量optind变量提供下一个要处理的argv元素的索引,在getopt()(首先)返回-1之后,optind提供索引第一个非选项参数。对于您而言,这就是您希望找到PATH的地方。

int main(int argc, char *argv[]) {
    const char options[] = "a";
    _Bool have_a = 0;
    char *the_path;
    int opt;

    do {
        switch(opt = getopt(argc, argv, options)) {
            case -1:
                the_path = argv[optind];
                // NOTE: the_path will now be null if no path was specified,
                //       and you can recognize the presence of additional,
                //       unexpected arguments by comparing optind to argc
                break;
            case 'a':
                have_a = 1;
                break;
            case '?':
                // handle invalid option ...
                break;
            default:
                // should not happen ...
                assert(0);
                break;
        }
    } while (opt >= 0);
}

答案 1 :(得分:2)

使用"a"的optstring可使-a的参数充当标志。
optind有助于检测到仅存在一个附加参数。
该程序可以作为./program -a path./program path

执行
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char op = ' ';//default value
    int opt;

    while ((opt = getopt(argc, argv, "a")) != -1)//optstring allows for -a argument
    {
        switch (opt)
        {
        case 'a':
            op = 'a';//found option, set op
            break;
        default:
            fprintf(stderr, "%s: unknown option %c\n", argv[0], optopt);
            return 1;
        }
    }
    if ( optind + 1 != argc)//one argument allowed besides optstring values
    {
        fprintf(stderr, "Usage: %s [-a] PATH\n", argv[0]);
        return 1;
    }

    printf("%s %c\n", argv[optind], op);
    return 0;
}