getopt Frage
-
Hallo,
Hab bisher immer meine "menus" ueber getopt erstellt, zb. so um ein file einzulesen:
./xxx t file...
while((opt = getopt(argc, argv, "f:")) != -1) { switch(opt) { case 'f': file_one = optarg; break; ...
Wie kann ich es bewerkstelligen, das ueber die commandline z.b "fP file..." eingegeben werden kann? "P" steht dann fuer eine andere Kategorie in meinem Programm, für das File. Das commanline-parsing macht einen total verrückt, wäre schön, wenn mir da einer weiterhelfen könnte.
-
also alle Parameter die du übergibst müssen irgendwie getrennt sein.
Das 'f' z.b. ist ja ein schalter.Meistens macht man es so,dass man schalter mit '-f' oder '/f' o.ä. angibt.
jeder durch leerzeichen getrennte string ist ein extra parameter.in deinem programm greifst du so drauf zu
int main (int argc, char** argv[]) { }
hierbei steht argc für die anzahl der argumente, achtung der progname ist auch eine argument.
in argv[] stehen die parameterargv[0] ist immer der programmname
argv[1] ist erster parameter z.b. "-f" als char-array
argv[2] z.b. "-p"
argv[artc-1] ist immer der letzte parameter, z.b. "deine_datei"
-
das ist mir schon klar, das was du meinst hab ich mit getopt gemacht.
mein problem ist nur, das ich auch schalter namens fP haben möchte, und "fP" kann ich ja nicht in einer switch anweisung abfragen.
-
du könntest dann so abfragen
int i=0; for (i=1; i<argc; i++) { switch (tolower(argv[i])) { case 'f': // mach was break; case 'p': // mach was break; default: // wenn du hier bist ist es ein string, den du mit strcmp // vergleichen könntest } }
-
ahh, gute idee, heut abend mal versuchen, danke.
-
Bei Strings mach ich das immer so:
//ermittelt, ob der Parameter ein Befehl ist und gibt den Index des Befehls zurück. //Parameter: //parameter => enthält den Parameter (string), der überprüft werden soll //Rückgabewert: //int => Index des Befehls // Wenn der Parameter nicht mit einem Befehl übereinstimmt, dann wird -1 zurückgegeben. int parseParameter(char * parameter) { const unsigned int ANZ_BEFEHLE = 2; int i; char * befehle[ANZ_BEFEHLE][] = { "abc", "xyz"}; //Prüfe jeden Befehl for(i = 0; i < ANZ_BEFEHLE; ++i) { // Wenn der Parameter mit einem Befehl übereinstimmt if(!strncmp(parameter, befehle[i], strlen(befehle[i]))) { //Gib den Index zurück return(i); } } //Wenn der Parameter mit keinem Befehl übereinstimmt gib -1 zurück return(-1); }
-
hallo,
ich hab dazu ein kl. problem:
static struct option const long_options[] = { {"multicastaddr", required_argument, 0, 'm'}, {"port", optional_argument, 0, 'p'}, {"ttl", optional_argument, 0, 't'}, {"iface", required_argument, 0, 'i'}, {"file", required_argument, 0, 'f'}, {"loops", optional_argument, 0, 'l'}, {"rate", optional_argument, 0, 'r'}, }; while ( (c = getopt_long(argc, argv, "mptiflr:", long_options, 0) ) != -1) { switch ( c ) { case 'm': printf("%s", optarg); multicastAddr = optarg; break;
aber leider is optarg IMMER null!
obwohl das "m" ein argument erwartet...kann mir da iener helfen?
danke im voraus!
-
hi
fuege mal ein : nach m dazu, also so:
while ( (c = getopt_long(argc, argv, "m:ptiflr:", long_options, 0) ) != -1)
-
hi!
ja, das wars.
und auch die man page nochmal genau gelesen -> muss wohl überall sein, wo ein parameter erwartet werden kann...thx
-
hm, also ich habe mich nun mal an folgendem versucht:
while((opt = getopt(argc, argv, "i:o:")) != -1) { switch(opt) { case 'i': if(strncmp(optarg, "A", 1) == 0) { while() { // hier hab ich ka. da ich nicht weisz, argv[optind++]; // wie ich eine bregrenzung angeben soll, } // da die anzahl der argumente variable ist. } else if(strncmp(optarg, "B", 1) == 0) { argv[optind++]; // s.o. } break; case 'o': if(strncmp(optarg, "T", 1) == 0) { fileT = argv[optind++]; // hier komm nur ein file, nach dem argument. stimmt so. } else if(strncmp(optarg, "H", 1) == 0) { fileH = argv[optind++]; // s.o. } break; ...
Syntax sollte spaeter sein:
./xxx -iA file1 file2 file...
koennte mir da evtl einer noch mal auf die spruenge helfen
-
hi!
probier mal getopt_long
weil getopt IMHO nur für 1 zeichen zulässig is...hth,
ciao
-
dachte getopt long, dient dafuer die argumente als:
--option blah oder --file xyz
einzulesen.
Also als ausgeschriebener wert inkl. "--" am anfang.
oder?
-
hi,
hmmm sorry, habs gestern zum ersten mal angewendet.
wusste gar nicht, dass man mit getopts auch "-morechars" definieren kann.
vielleicht schreibst dir selber was dafür?sorry für meine "nicht-wirklich-gute-hilfe"
ciao
-
hehe, nun, versuche es ja mit der while, nur fallen mir an begrenzungsmoeglichkeiten bis zum ende der eingabe fuer einen schalter mit unbestimmten argumenten auf anhieb nur folgende methoden ein:
- lesen bis \n kommt
- lesen bis -x kommt (x anderer schalter)nur haut das irgendwie nicht hin...