दिलचस्प पोस्ट
Console.log क्या है? मैं आरक्षित शब्दों से किस प्रकार से बचता हूं जो स्तंभ नामों के रूप में इस्तेमाल होता है? MySQL / तालिका बनाएं मेरा C ++ कोड चलाना मुझे एक खाली कंसोल देता है Jqgrid: चयनित पंक्ति के आधार पर नेविगेशन रेंगमेंट यूआरएल के साथ जेकग्रीड की इनलाइन-संपादन का उपयोग करना? एक जावा विधि से कई ऑब्जेक्ट कैसे लौटाएंगे? MySQL में 2 घंटे वर्तमान समय में जोड़ें? मैं कैसे जांचूं अगर एक तत्व jQuery में छुपा हुआ है? आइडिया में टॉमकेट युद्ध विस्फोट: सर्वर कनेक्ट नहीं है तैनाती उपलब्ध नहीं है मैं एंटिआई फ्रेमवर्क में कई पंक्तियों को कैसे हटाऊं (बिना foreach के) कोरोना, फोनगैप, टाइटेनियम के बीच तुलना रेल 4: उपलब्ध डेटाटाइपों की सूची सी ++ 11 ऑटो कीवर्ड के साथ कितना बड़ा है? सबसे आम एसक्यूएल विरोधी पैटर्न क्या हैं? सी # यूटीएफ -8 से आईएसओ -885 9-1 (लैटिन 1) एच से स्ट्रिंग कन्वर्ट करें

सी ++ के लिए पैरामीटर पार्सर पुस्तकालय क्या हैं?

मैं निम्नलिखित तरीके से अपने सी ++ प्रोग्राम के लिए पैरामीटर पास करना चाहता हूं:

./myprog --setting=value 

क्या कोई पुस्तकालय है जो मुझे आसानी से करने में मदद करेगा?

सी और यूनिक्स के लिए तर्क-पार्सिंग सहायक भी देखें

वेब के समाधान से एकत्रित समाधान "सी ++ के लिए पैरामीटर पार्सर पुस्तकालय क्या हैं?"

Boost.Program_options

जीएनयू गेटऑप्ट

GetOpt का उपयोग करते हुए एक सरल उदाहरण:

 // C/C++ Libraries: #include <string> #include <iostream> #include <unistd.h> // Namespaces: using namespace std; int main(int argc, char** argv) { int opt; bool flagA = false; bool flagB = false; // Shut GetOpt error messages down (return '?'): opterr = 0; // Retrieve the options: while ( (opt = getopt(argc, argv, "ab")) != -1 ) { // for each option... switch ( opt ) { case 'a': flagA = true; break; case 'b': flagB = true; break; case '?': // unknown option... cerr << "Unknown option: '" << char(optopt) << "'!" << endl; break; } } // Debug: cout << "flagA = " << flagA << endl; cout << "flagB = " << flagB << endl; return 0; } 

यदि आपके विकल्प हैं जो तर्क स्वीकार करते हैं, तो आप ऑप्टगेट का उपयोग भी कर सकते हैं।

TCLAP वास्तव में अच्छा हल्के डिजाइन और प्रयोग करने में आसान है: http://tclap.sourceforge.net/

मुझे ezOptionParser का उपयोग करना आसान लगता है यह एक एकल हेडर फाइल है, कुछ भी पर निर्भर नहीं है, लेकिन एसटीएल, विंडोज और लिनक्स (बहुत अधिक अन्य प्लेटफॉर्म भी) के लिए काम करता है, इस उदाहरण के लिए कोई सीखने की कमी नहीं है, इसमें अन्य पुस्तकालयों की सुविधा नहीं है (जैसे फ़ाइल आयात / निर्यात टिप्पणियों के साथ, मनमाना विकल्प के नाम से सीमांकक, ऑटो उपयोग स्वरूपण, आदि), और एलजीजीएल लाइसेंस प्राप्त है।

और एक Google लाइब्रेरी उपलब्ध है

वास्तव में, कमांड लाइन पार्सिंग "हल हो गई है।" बस एक उठाओ

जीएनयू सी लाइब्रेरी में ये उपकरण हैं, जिसमें गेटओप्ट शामिल है

यदि आप क्यूटी प्रयोग कर रहे हैं और GetOpt इंटरफ़ेस की तरह, froglogic ने यहां एक अच्छा इंटरफ़ेस प्रकाशित किया है ।

मुझे पता है कि जीएनयू गेटऑप्ट उपयोग करने के लिए बहुत तात्कालिक नहीं है।
क्यूटी और बूस्ट एक समाधान हो सकता है, लेकिन आपको बहुत सारे कोड डाउनलोड और संकलित करने की आवश्यकता है।

इसलिए मैंने अपने द्वारा एक पारसर लागू किया है जो मापदंडों के एक std :: नक्शे का उत्पादन करता है।
उदाहरण के लिए,

  ./myProgram -v -p 1234 

मानचित्र होगा:

  ["-v"][""] ["-p"]["1234"] 

उपयोग यह है:

 int main(int argc, char *argv[]) { MainOptions mo(argc, argv); MainOptions::Option* opt = mo.getParamFromKey("-p"); const string type = opt ? (*opt).second : ""; cout << type << endl; /* print 1234 */ /* your check code */ } 

MainOptions.h

 #ifndef MAINOPTIONS_H_ #define MAINOPTIONS_H_ #include <map> #include <string> class MainOptions { public: typedef std::pair<std::string, std::string> Option; MainOptions(int argc, char *argv[]); virtual ~MainOptions(); std::string getAppName() const; bool hasKey(const std::string&) const; Option* getParamFromKey(const std::string&) const; void printOptions() const; private: typedef std::map<std::string, std::string> Options; void parse(); const char* const *begin() const; const char* const *end() const; const char* const *last() const; Options options_; int argc_; char** argv_; std::string appName_; }; 

MainOptions.cpp

 #include "MainOptions.h" #include <iostream> using namespace std; MainOptions::MainOptions(int argc, char* argv[]) : argc_(argc), argv_(argv) { appName_ = argv_[0]; this->parse(); } MainOptions::~MainOptions() { } std::string MainOptions::getAppName() const { return appName_; } void MainOptions::parse() { typedef pair<string, string> Option; Option* option = new pair<string, string>(); for (const char* const * i = this->begin() + 1; i != this->end(); i++) { const string p = *i; if (option->first == "" && p[0] == '-') { option->first = p; if (i == this->last()) { options_.insert(Option(option->first, option->second)); } continue; } else if (option->first != "" && p[0] == '-') { option->second = "null"; /* or leave empty? */ options_.insert(Option(option->first, option->second)); option->first = p; option->second = ""; if (i == this->last()) { options_.insert(Option(option->first, option->second)); } continue; } else if (option->first != "") { option->second = p; options_.insert(Option(option->first, option->second)); option->first = ""; option->second = ""; continue; } } } void MainOptions::printOptions() const { std::map<std::string, std::string>::const_iterator m = options_.begin(); int i = 0; if (options_.empty()) { cout << "No parameters\n"; } for (; m != options_.end(); m++, ++i) { cout << "Parameter [" << i << "] [" << (*m).first << " " << (*m).second << "]\n"; } } const char* const *MainOptions::begin() const { return argv_; } const char* const *MainOptions::end() const { return argv_ + argc_; } const char* const *MainOptions::last() const { return argv_ + argc_ - 1; } bool MainOptions::hasKey(const std::string& key) const { return options_.find(key) != options_.end(); } MainOptions::Option* MainOptions::getParamFromKey( const std::string& key) const { const Options::const_iterator i = options_.find(key); MainOptions::Option* o = 0; if (i != options_.end()) { o = new MainOptions::Option((*i).first, (*i).second); } return o; } 

अगर मैं कर सकता हूं तो अपना खुद का सींग टूट कर, मैं भी एक विकल्प पार्सिंग लायब्रेरी पर एक नज़र रखना चाहूंगा जो मैंने लिखा है: dropt

  • यह सी लाइब्रेरी है (यदि सी ++ आवरण के साथ वांछित है)।
  • यह हल्के है
  • यह एक्स्टेंसिबल है (कस्टम तर्क प्रकार आसानी से जोड़ा जा सकता है और अंतर्निहित तर्क प्रकारों के साथ समान स्तर है)।
  • यह बहुत पोर्टेबल होना चाहिए (यह मानक सी में लिखा है) कोई निर्भरता (सी मानक पुस्तकालय के अलावा) के साथ।
  • इसमें एक बहुत ही अप्रतिबंधिक लाइसेंस (zlib / libpng) है

एक फीचर जो यह ऑफर करता है कि बहुत से अन्य लोग पहले विकल्पों को ओवरराइड करने की क्षमता नहीं देते हैं। उदाहरण के लिए, यदि आपके पास एक शेल उपनाम है:

 alias bar="foo --flag1 --flag2 --flag3" 

और आप bar का उपयोग करना चाहते हैं लेकिन --flag1 अक्षम के साथ, यह आपको करने की अनुमति देता है:

 bar --flag1=0 

argstream लिए काफी समान boost.program_option : यह विकल्प, आदि में वैरिएबल को बाइंड करने की अनुमति देता है। हालांकि यह कॉन्फ़िगरेशन फ़ाइल में संग्रहीत विकल्पों को संभाल नहीं करता है।

सीएलपीपी पुस्तकालय की कोशिश करो यह कमांड लाइन पैरामीटर पार्सिंग के लिए सरल और लचीला लाइब्रेरी है। हेडर केवल और क्रॉस-प्लेटफॉर्म आईएसओ सी ++ का उपयोग करता है और केवल सी ++ पुस्तकालयों को बढ़ावा देता है आईएमएचओ बूस्ट से आसान है। प्रोग्राम_पोप

लाइब्रेरी: http://sourceforge.net/projects/clp-parser/

26 अक्टूबर 2010 – नया रिलीज 2.0 आर.सी. कई बग तय किए गए हैं, स्रोत कोड, दस्तावेज़ीकरण, उदाहरणों और टिप्पणियों का पूरी तरह से पुनर्संरचना ठीक कर दिया गया है।

क्यूटी 5.2 एक कमांड लाइन पार्सर एपीआई के साथ आता है ।

छोटा उदाहरण:

 #include <QCoreApplication> #include <QCommandLineParser> #include <QDebug> int main(int argc, char **argv) { QCoreApplication app(argc, argv); app.setApplicationName("ToolX"); app.setApplicationVersion("1.2"); QCommandLineParser parser; parser.setApplicationDescription("Tool for doing X."); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("infile", QCoreApplication::translate("main", "Input file.")); QCommandLineOption verbose_opt("+", QCoreApplication::translate("main", "be verbose")); parser.addOption(verbose_opt); QCommandLineOption out_opt(QStringList() << "o" << "output", QCoreApplication::translate("main", "Output file."), QCoreApplication::translate("main", "filename"), // value name QCoreApplication::translate("main", "out") // default value ); parser.addOption(out_opt); // exits on error parser.process(app); const QStringList args = parser.positionalArguments(); qDebug() << "Input files: " << args << ", verbose: " << parser.isSet(verbose_opt) << ", output: " << parser.value(out_opt) << '\n'; return 0; } 

उदाहरण आउटपुट

स्वत: जनित मदद स्क्रीन:

 $। / qtopt -h
 उपयोग: ./qtopt [options] infile
 एक्स करने के लिए उपकरण

 विकल्प:
   -एच, --help यह सहायता दिखाता है
   -v, --version संस्करण जानकारी प्रदर्शित करता है
   - + वर्बोस हो
   -o, --output आउटपुट फ़ाइल

 तर्क:
   infile इनपुट फ़ाइल

स्वत: उत्पन्न संस्करण आउटपुट:

 $ ./qtopt -v
 टूलएक्स 1.2

कुछ असली कॉल:

 $ ./qtopt b1 - + -o tmp blah.foo
 इनपुट फ़ाइलें: ("बी 1", "ब्लाह.फू"), वर्बोज़: सत्य, आउटपुट: "टीएमपी"
 $ ./qtopt          
 इनपुट फ़ाइलें: (), वर्बोस: गलत, आउटपुट: "आउट"

एक पार्स त्रुटि:

 $ ./qtopt --hlp
 अज्ञात विकल्प 'एचएलपी'
 $ गूंज $?
 1

निष्कर्ष

यदि आपका प्रोग्राम पहले से ही Qt (> = 5.2) पुस्तकालयों का उपयोग करता है, तो इसकी कमांड लाइन पार्सिंग एपीआई काम करने के लिए पर्याप्त सुविधाजनक है।

सावधान रहें कि विकल्प पार्सर चलाने से पहले QApplication द्वारा builtin Qt विकल्प का उपयोग किया जाता है।

आप मेरे छोटे विकल्प हेडर (166 लोकेशन बहुत आसानी से हैक करने योग्य) options.hpp कोशिश कर सकते हैं। यह एक एकल हेडर क्रियान्वयन है और जिसे आप पूछना चाहिए। यह आपको सहायता पृष्ठ को स्वचालित रूप से प्रिंट भी करता है।

वहाँ से बाहर सी + + तर्क विश्लेषक के एक जोड़े हैं, आप http://clp.sourceforge.net/ से यह एक कोशिश करना चाहते हैं, बहुत सरल और सुविधाजनक।