C / C ++ getopt optssortingng syntax

En utilisant la fonction getopt incluse dans unistd.h en C ++, existe-t-il un moyen de structurer l’optssortingng de telle sorte que …

[-a] [-f "reg_expr"] out_file1 [[-f "reg_expr"] out_file2 ...] est possible?

Ceci est un devoir, mais l’accent n’est pas mis sur cette sous-tâche spécifique.

Dans ma tête, je voudrais préciser la logique suivante:

(un argument), (infiniment de nombre d’arguments f avec 2 arguments (sub) requirejs), … (nombre infini d’arguments génériques)

Peut-être que ma compréhension de la fonction getopt est fondamentalement erronée. J’ai aussi vu un getopt_long . C’est peut-être ce qui me manque.

Au départ, j’avais rédigé ceci, ce qui a fonctionné, mais je suis tombé sur la fonction getopt et getopt pensé que cela pourrait faire un meilleur travail.

 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; } } 

Remarque: supposons que ceci est écrit pour un environnement Unix. Je ne pense pas pouvoir utiliser quoi que ce soit de la bibliothèque standard. J’ai seulement inclus std :: cout à des fins de test.

Je serai heureux de développer tous les détails de la mission. Cependant, la question principale concerne la syntaxe de l’optssortingng. Je suis actuellement seulement au courant de: sens nécessaire et :: sens facultatif existe-t-il un moyen de spécifier des arguments qui se répètent comme un joker regex *?

MODIFIER:

Je suis sûr que c’est bâclé en raison du fait que je ne pense pas que getopt est conçu pour gérer plusieurs arguments par option, mais il fait le tour …

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

Vous devez faire une boucle getopt distincte pour chaque groupe d’options et le nom du fichier de sortie.

 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++; }