2012-04-16 14 views
5

मैं अपने आवेदन में कमांड लाइन पार्सिंग इंटरफ़ेस प्रदान करने के लिए boost::program_options का उपयोग करता हूं। मैं, यह कॉन्फ़िगर करने के लिए विकल्पों को पार्स चाहते हैंबढ़ावा में अनचाहे पैरामीटर को कैसे प्रबंधित करें :: program_options

using namespace boost::program_options; 
options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file"); 

positional_options_description p; 
p.add("input-file", 1); 

variables_map vm; 

parsed_options parsed = command_line_parser(ac, av). 
options(desc).positional(p).run(); 
store(parsed, vm); 
notify(vm); 

मैं इसे कॉन्फ़िगर करने के लिए इतना है कि पिछले स्विच करने के बाद हर टोकन वेक्टर का एक रूप में दिया जाता है चाहते हैं। मैंने बूस्ट दस्तावेज में दिए गए उदाहरण के अनुसार collect_unrecognized का उपयोग करने का प्रयास किया है, लेकिन मैंने कुछ समस्याओं में भाग लिया है क्योंकि मैं इनपुट फ़ाइल के लिए स्थितित्मक तर्क का भी उपयोग कर रहा हूं।

असल में मैं इसे ऐसा करना चाहता हूं। अगर मैं है:

./program -i "inputfile.abc" argument1 argument2 argument3 

मैं इसे input-file मूल्य में inputfile.abc स्टोर और argument1, argument2 और argument3 अवांछित तर्क एक की vector<string> वापसी करना चाहते हैं।

मैं हालांकि यह भी, एक स्थितीय तर्क है करने के लिए सक्षम होने के लिए इतना है कि

./program "inputfile.abc" argument1 argument2 argument3 

मुझे एक ही परिणाम देना होगा चाहते हैं।

मुझे खेद है अगर यह पहले से ही पूछा जा चुका है और सहायता के लिए धन्यवाद।

उत्तर

3

मैं कोड के साथ आया जो चाल करता है, लेकिन यह मामूली कामकाज है। यही है, मैंने स्थितित्मक खंड को छोड़ दिया और अपरिचित लोगों के पहले तर्क को लेने का प्रयास किया। ऐसा लगता है कि यह ठीक काम कर रहा है, लेकिन यह बहुत लचीला नहीं है।

using namespace boost::program_options; 

options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file") 
    ; 

variables_map vm; 
vector<string> additionalParameters; 

parsed_options parsed = command_line_parser(ac, av). 
    options(desc).allow_unregistered().run(); 
store(parsed, vm); 
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional); 
notify(vm); 

if (!vm.count("input-file")) 
    if (additionalParameters.empty()) 
    { 
     cerr << "error: No input file specified\n"; 
     return EXIT_FAILURE; 
    } 
    else 
    { 
     inputFileName = additionalParameters[0]; 
     additionalParameters.erase(additionalParameters.begin()); 
    } 
else 
    inputFileName = vm["input-file"].as<string>(); 
संबंधित मुद्दे