C++ Konsolenanwendung Argumente überprüfen
-
Hallo zusammen.. Ich mus im Geschäft eine Applikation schreiben, die Messwerte eines Messgerätes über den COM-Port ausliest und in ein CSV File schreibt.
Dies funktioniert wunderbar, jedoch muss ich nun noch einige zusätzliche Dinge programmieren und zwar sollen verschiedene Parameter angegeben werden wie:
-debug --> Die messwerte Sollen auch in der Konsole ausgegeben werden.
-v --> Ähnlich wie -debug
-variable --> Messmodus soll gewählt werden können
-range --> Messbereich soll ausgewählt werden können(1-4)
-version --> Die Version der Applikation wird ausgegeben
-help --> Ein Hilfetext wird angezeigt**Nun meine Frage:
Wie kann ich überprüfenwie wie viele und welche(s) Argument(e) asgewählt wurden?Kann man dies mit einer Switch Anweisung oder einer If-Verzweigung herausfinden?**
Bis jetzt habe ich erst diese überprüfung unten. Jedoch werden dort nur die Parameter überprüft, die benötigt werden um eine Voltmessung mit Standard Messbereich durchzuführen.
Argumente: COM-Port, Baud-Rate und Range.
Wird es ohne Parameter gestartet erscheint der Hilfe Text.[cpp]///////////////////////////////////////////////////////////////////////////////////////// // PARAMETER SETZEN // ///////////////////////////////////////////////////////////////////////////////////////// // how many parameters are given (argv[0] is the program path so the user didn't type any parameter switch(argc) { //The user will be informed, how to use the sniffer case 1: cout << "How to use Fluke 45 Reader: " << endl; cout << ">Fluke_45_reader.exe <COM port> [<Baud rate>]" << endl; cout << "COM port: The COM port, where the Fluke is connected." << endl; cout << "Baud rate: 9600, 19200 or 57600, default: 9600" << endl << endl; cout << "Other Parameters:" << endl; cout << "-debug shows the messages from or to the Fluke with a time stamp" << endl; cout << "-v shows the same text, wich is also written in the log-file" << endl; cout << "-range 1-4 Range: 1: 300mV 2: 3V 3: 30V 4: 300V" << endl; cout << "-version shows the version of the Fluke reader" << endl << endl; cout << "To stop the sniffer press CTRL + C" << endl << endl; break; //try to set the com port case 2: iComPort = atoi(argv[1]); bArgsSet = true; break; //try to set Com port and baud rate case 3: iComPort = atoi(argv[1]); iBaudRate = atoi(argv[2]); bArgsSet = true; break; case 4: iComPort = atoi(argv[1]); iBaudRate = atoi(argv[2]); Range = atoi(argv[3]); bArgsSet = true; break; } [/cpp]Bin froh über jede Hilfe kommme echt nicht weiter..
Vielen Dank
-
switch ist da ziemlich fehl am Platz. Ich würd ne for-(oder while) Schleife draus machen, den Fall ohne Argumente evtl. vorher mit nem if abfragen und dann ein argument nach dem anderen verwerten.
Alternativ gibts auch Bibliotheken die sich um solche Kommandozeilenargumente kümmern.
-
pumuckl schrieb:
switch ist da ziemlich fehl am Platz. Ich würd ne for-(oder while) Schleife draus machen, den Fall ohne Argumente evtl. vorher mit nem if abfragen und dann ein argument nach dem anderen verwerten.
meinst du in etwa so?:
[cpp] if (argc = 0) { cout << "How to use Fluke 45 Reader: " << endl; cout << ">Fluke_45_reader.exe <COM port> [<Baud rate>]" << endl; cout << "COM port: The COM port, where the Fluke is connected." << endl; cout << "Baud rate: 9600, 19200 or 57600, default: 9600" << endl << endl; cout << "Other Parameters:" << endl; cout << "-debug shows the messages from or to the Fluke with a time stamp" << endl; cout << "-v shows the same text, wich is also written in the log-file" << endl; cout << "-range 1-4 Range: 1: 300mV 2: 3V 3: 30V 4: 300V" << endl; cout << "-version shows the version of the Fluke reader" << endl << endl; cout << "To stop the sniffer press CTRL + C" << endl << endl; } else { for( int i = 1; i<= argc; i++) { if (strcmp (argv[i], "-debug") == 1) { DebugMode == true; } if (strcmp (argv[i], 9600) == 1) { iBaudRate = 9600; } if (strcmp (argv[i], 19200) == 1) { iBaudRate = 19200; } if (strcmp (argv[i], 57600) == 1) { iBaudRate = 57600; } if (strcmp (argv[i], 1) == 1) { iBaudRate = 1; } if (strcmp (argv[i], 2) == 1) { iBaudRate = 2; } if (strcmp (argv[i], 3) == 1) { iBaudRate = 3; } if (strcmp (argv[i], 4) == 1) { iBaudRate = 4; } if (strcmp (argv[i], 5) == 1) { iBaudRate = 5; } if (strcmp (argv[i], 6) == 1) { iBaudRate = 6; } if (strcmp (argv[i], "-help") == 1) { showHelpText(); } if (strcmp (argv[i], 2) == 1) { DebugMode == true; } } }[/cpp]Meiner Meinung nach gibt dies viel zu viel Code und wirkt unüberichtlich.. Ausserdem können nie alle möglichen Eingaben verwertet werden.
Hast du vielleicht ein Beispiel wie man 2-3 Argumente überprüfen könnte?
pumuckl schrieb:
Alternativ gibts auch Bibliotheken die sich um solche Kommandozeilenargumente kümmern.
Wo finde ich diese Bibliotheken? Sind das Windows standard Bibliotheken oder muss ich die zusätzlich downloaden?
-
Eine Standardfunktion dafür gibt es nicht, GNU hat dafür aber getopt:
http://www.gnu.org/software/libc/manual/html_node/Getopt.html
-
du könntest mal nach
c++ getoptoderc++ anyoptiongoogeln
ich habe beide noch nicht benutzt aber die sind wohl für sowas da
-
Danke für eure Hilfe.. werde mich darüber etwas schlau machen. Jedoch habe ich gemerkt, das das Programm gar nicht richtig läuft.. muss zuerst fertigbringen, dass alles andere läuft.
-
Ich find boost::program_options ziemlich cool
