Синтаксис C / C ++ getopt optstring

С использованием getopt Функция, включенная в unistd.h в C ++, есть способ структурировать строку 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 для тестирования.

Я буду рад уточнить любые детали этого задания. Однако главный вопрос вращается вокруг синтаксиса строки опций. В настоящее время я знаю только: значение обязательное и :: значение необязательное. Есть ли способ указать аргументы, которые повторяются как подстановочный знак регулярного выражения *?

РЕДАКТИРОВАТЬ:

Я уверен, что это небрежно из-за того, что я не думаю, что 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++;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]