ein kleines c++ Programm mittels commando-line bedienen



  • Hallo Profis,

    mein kleines c++ Programm benötigt 3 Strings als Übergabe-Parameter um ausgeführt zu werden.

    Und zwar ungefähr so:

    int main()
    {
    neueDateiGenerieren(string ersteDateiZumLesen, string zweiteDateiZumLesen, string nameVonDateiZumGenerieren);
    
    return 0;
    }
    

    Dadurch, dass ich das Programm über Kommando-Zeile aufrufen möchte, und die Übergabe-Parameter nicht rein kodieren möchte, würde ich gerne folgenderweise das Programm auszuführen:

    meinKleinesProgramm.exe -e ersteDateiZumLesen -z zweiteDateiZumLesen -n nameVonDateiZumGenerieren
    

    Und es wäre natürlich auch cool, wenn ich eine Hilfsfunktion haben könnte, die mir mitteilt, wie ich die Argumente geben soll:

    meinKleinesProgramm.exe --help
    

    Weiss jemand wie ich sowas mache? Sowas habe ich bis jetzt noch nicht gemacht. Aber ich würde es gerne jetzt wissen.

    Danke voraus

    Gruß



  • es gibt eine zweite moegliche Signatur fuer die main():

    int main(int argc, char** argv)
    

    , wo die Zahl und Werte der Kommandzeilenparameter uebergeben werden. Beispiele zu deren Verwendung findest du unter anderem hier: http://pronix.linuxdelta.de/C/standard_C/c_programmierung_16.shtml (ist einfach nur der erste Link, denn google auf der Suche nach argc und argv ausspuckt, scheint aber nicht ganz verkehrt zu sein)



  • danke für die schnelle Antwort.

    Ich kenne mich gar nichts mit C-Code aus. Aber ich würde mir trotzdem die Seite angucken.
    Wenn jemand sich damit sehr gut auskennt, könnte er gleich den Code schreiben. Ich brauche das auf die schnelle.

    Danke voraus.

    Gruß



  • Hier wird keiner deine Arbeit machen, wenn er kein Geld dafür bekommt!



  • soll ich Geld für sowas zahlen????
    Ich brauche nur ein paar Stunden, um selbst das hinzukriegen.

    Ausserdem, ich habe dich gar nichts gefragt. Ich bezweifle, ob du überhaupt das machen kannst.



  • Nunja, der Zugriff auf die Arrayelemente von argv ist derselbe in C und C++, das einzige was auf der angegebenen Seite nicht wirklich C++ ist, sind die ganzen printf's (waeren cout's in C++, mit etwas anderer Syntax). Aber im Wesenlichen ist da zwischen C und C++ kein grosser Unterschied. Folgender Codeschnipsel koennte dir helfen:

    int main(int argc, char** argv) {
    
    std::vector<std::string> kommandoargs;
    for(int i = 0; i < argc; ++i) kommandoargs.push_back(std::string(argv[i]));
    
    //jetzt sind im kommandoargs vector die kommandozeilenparameter gespeichert, angefangen mit dem namen des programms
    
    }
    

    probiers einfach mal aus 🙂
    Was das "mal eben auf die schnelle Komplettloesung liefern" angeht - das ist nicht unbedingt Sinn dieser Seite (sowas gibts eigentlich nirgends umsonst). In den meisten Faellen musst du dich hier mit Hilfestellungen zufrieden geben, die dir aber genug verraten um das Problem selbst zu loesen. (Ist auf Dauer auch sinnvoller, da lernt man naemlich selbst auch was bei und muss nicht mit jedem neuen Problem wieder hierher und drauf warten dass man die Loesung bekommt) 😉



  • soll ich Geld für sowas zahlen????
    Ich brauche nur ein paar Stunden, um selbst das hinzukriegen.

    Dann mach's doch selber 😃

    Ausserdem, ich habe dich gar nichts gefragt. Ich bezweifle, ob du überhaupt das machen kannst.

    Dein voriger Beitrag hier klang aber ganz anders.



  • Hallo Profis,

    ich hab´s hingekriegt. Und es ist sehr einfach.

    void usage() 
    {
      // fprintf(stderr,"Parameters:\t[--help] -b bits_filename -c num\n");
      fprintf(stderr,"Parameters:\t[--help] -b test1 -c test2 -d test3\n");
    }
    
    int main(int argc, char ** argv)
    {
    
      string test1, test2, test3;
    
      if (1==argc) 
      {
        usage(); 
        return(0);
      }
    
      for(int i=1; i<argc; i++)
      {
        if (!strcmp(argv[i],"--help"))
        {
          usage();
          return(0);
        }
        if (!strcmp(argv[i],"-b")) 
        {
          i++;
          if (i>=argc) {usage();return(1);}
           test1=argv[i];
          continue;
        }
        if (!strcmp(argv[i],"-c")) 
        {
          i++;
          if (i>=argc) {usage();return(1);}
           test2=argv[i];
          continue;
        }
    
        if (!strcmp(argv[i],"-d")) 
        {
          i++;
          if (i>=argc) {usage();return(1);}
           test3=argv[i];
          continue;
        }
      }
    
      getDieserTest(test1, test2, test3);
    
      return 0;
    }
    

    Aber danke für die Internetseite.

    Gruß



  • soll ich Geld für sowas zahlen????
    Ich brauche nur ein paar Stunden, um selbst das hinzukriegen.

    hast du ne vorstellung, was nen anständiger softwareentwickler für "ein paar stunden" coden verdient? 😉



  • thordk schrieb:

    hast du ne vorstellung, was nen anständiger softwareentwickler für "ein paar stunden" coden verdient? 😉

    Ja habe ich. Das war gar nicht das Thema. Und das ist auch keine Software zu entwickeln, sondern ein paar Zeilen Code zu schreiben.



  • kalissow schrieb:

    thordk schrieb:

    hast du ne vorstellung, was nen anständiger softwareentwickler für "ein paar stunden" coden verdient? 😉

    Ja habe ich. Das war gar nicht das Thema. Und das ist auch keine Software zu entwickeln, sondern ein paar Zeilen Code zu schreiben.

    Ach - das sagen sie alle.
    Ich sage: "Ich werde nicht nach Zeilen- sondern nach Stundenzahl bezahlt"
    und
    "ein paar Zeilen" = "Mal eben" = Jahrelange Unterhaltsverpflichtung
    😃

    Zu Deinem Code: Du weißt schon, dass das eigentlich kein C++ (bzw. keine sprachadäquate Lösung) ist, oder ?

    In C++ hat man so schöne Dinge wie string, vector, cerr, ....

    Außerdem würde ich die erlaubten Werte ebenfalls "dynamisieren" ...
    (dann bleibt von dem ganzen "if/else"-Geraffel ein "map::find()" übrig)

    Gruß,

    Simon2.


Anmelden zum Antworten