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 parameter

    argv[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...


Anmelden zum Antworten