С использованием 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
}
}
Вам нужно сделать отдельный цикл 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++;
}
Других решений пока нет …