Die meisten effizienten Art und Weise zu verarbeiten-Argumente aus der Kommandozeile in C++
Anregungen für command-line Arguments - Verarbeitung in C++ effizient:
Hinweis:: Windows-spezifische nur
1: #include <iostream.h>
2: int main(int argc, char **argv)
Statt, zum Beispiel:
if ( argc != 3 ) {
....
}
Hinsichtlich
- Was werden Sie Fragen. Könnten Sie das klären?
- Wie ist das Windows-spezifische?
- Weil ich wurde das Gebäude unter Windows an der Zeit!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit C++, die Antwort ist in der Regel in Boost...
Boost.Programm-Optionen
Wenn Sie nur wollen, um Prozess-Befehlszeile Optionen selbst, die einfachste Weg ist zu setzen:
oben Ihre
main()
. Diese kopiert alle Kommandozeilen-Argumente in einen Vektor vonstd::string
s. Dann können Sie==
strings vergleichen Sie einfach, statt endlosstrcmp()
Anrufe. Zum Beispiel:[EDIT: ich merkte, ich war kopieren
argv[0]
, den Namen des Programms, inargs
- behoben.]mycommand.exe -h file.csv
möchte ich Ihnen sagen, dass Sie nicht mit dem Dienstprogramm korrekt und warum (sollte nicht der name einer Datei, wenn Sie nur mit der version). Dieses Beispiel ist relativ einfach, aber ich denke, der kann mehr gewundenen flags. Das Ergebnis würde sein: manchmal ist die Reihenfolge nicht egal ist, und manchmal nicht. So ... wie soll ich Vorgehen dann? Lassen Sie mich wissen, wenn Sie eine Frage haben zu meiner Frage.args[i]
(in der Tat habe ich oft das selbst tun, wie der Kommentar in meinem code-snippet sagt). Das iterator-Stil ist nur ein wenig bequemer, wenn Sie nur benötigen, um mit ein zu einer Zeit. Nicht, dass die Antwort auf Ihre Frage?Ich würde vorschlagen, über eine Bibliothek. Es gibt die klassischen und ehrwürdigen getopt und ich bin sicher, andere.
Gibt es eine Reihe von guten Bibliotheken erhältlich.
Boost-Programm-Optionen ist ein ziemlich Schwergewichts-Lösung, weil Sie es zu Ihrem Projekt erfordert, dass Sie zu bauen, zu steigern, und die syntax ist auch etwas verwirrend (meiner Meinung nach). Jedoch, es kann so ziemlich alles inklusive, dass die Kommandozeilen-Optionen überschreiben diejenigen in den Konfigurationsdateien.
SimpleOpt ist ein ziemlich umfassendes, aber einfaches Kommandozeilen-Prozessor. Es besteht aus einer einzigen Datei und hat eine einfache Struktur, aber nur mit dem Parsen der Kommandozeile in Optionen, die Sie haben, um alles tun, die Art und den Umfang der überprüfung. Es ist gut für beide, Windows und Unix und kommt mit einer version von glob auch für Windows.
getopt ist verfügbar auf Windows. Es ist das gleiche wie auf Unix-Maschinen, aber es ist oft eine GPL-Bibliothek.
Dies ist meine Lieblings Art zu tun, der Befehl Linie, vor allem, aber definitiv nicht nur bei der Effizienz ist ein Problem. Es mag übertrieben, aber ich denke, es gibt einige Nachteile bei diesem overkill.
Verwenden gperf für effizienten C/C++ - command line Verarbeitung
Nachteile:
Vorteile:
Verwendung einer IDE wie eclipse kann man wohl automatisieren den Prozess der Laufenden gperf, so dass die einzige Sache, die Sie würde tun müssen ist, fügen Sie eine option in der config-Datei und Ihre "switch" - Anweisung, und drücken Sie bauen...
Habe ich eine batch-Datei, um Sie auszuführen gperf und tun etwas Aufräumen und fügen Sie Wachen mit sed (auf der gperf generiert .hpp-Datei)...
So, extrem präzise und clean code innerhalb der software und eine auto-generierte hash-Tabelle-Datei, die Sie nicht wirklich brauchen, um manuell ändern. Ich bezweifle, dass boost::program_options tatsächlich schlagen würde, dass auch ohne Energieeffizienz als eine Priorität.
Wenn Sie nicht möchten, um boost, würde ich empfehlen, diese little helper-Klasse.
Versuchen CLPP-Bibliothek. Es ist einfach und flexibel-Bibliothek für Kommandozeilen-Parameter zu Parsen. Header-only und cross-Plattform. Mit ISO C++ und Boost C++ - Bibliotheken nur. IMHO ist es einfacher als Boost.Program_options.
Bibliothek: http://sourceforge.net/projects/clp-parser
26. Oktober 2010 - die neue Version 2.0 rc. Viele bugs behoben, full-refactoring des source-code, Dokumentation, Beispiele und Kommentare korrigiert wurden.