2012-10-31 22 views
9

मैं वर्तमान में एक लिनक्स सी ++ एप्लिकेशन डिज़ाइन कर रहा हूं। यह कमांड लाइन से चलाया जाएगा, तो एक बार मैं इसके निष्पादन, आदर्श की तरह कुछ नियंत्रित करने के लिए आदेश जारी करने में सक्षम होने की जरूरत है चल रहा है:सी ++ कमांड लाइन इंटरफ़ेस

$ sudo ./myapplication 
APP > 
APP > 
APP > //just pressing return 
APP > openlog test1.txt //APP will now call the openlog function 
APP > 

मैं कल्पना यह एक अपेक्षाकृत सरल काम नहीं है, लेकिन मेरे पास है किसी को खोजने के लिए ऐसा कोई इंटरफ़ेस नहीं कहा जाएगा। क्या किसी को पुस्तकालय या उदाहरण के बारे में पता है जो इस समारोह को कर सकता है? या मुझे cout और cin का उपयोग करके अपना खुद का लिखना है? यदि हां, तो क्या कोई पसंदीदा दृष्टिकोण होगा?

+1

सी ++ में प्रतिबिंब नहीं है। आपको इसके आसपास काम करना होगा। – chris

+0

यदि आपको यह नहीं पता कि यह कैसे करना है, तो आपको सुपरसियर द्वारा चलाने के लिए एप्लिकेशन नहीं लिखना चाहिए .... – Barmar

+3

@ बाड़ार यह कहने के लिए हाइपरबॉलिक है कि इस एप्लिकेशन को सु द्वारा चलाने की आवश्यकता है, और मोरेसो किसी को कहने की जरूरत है विशेषज्ञता के कथित स्तर की वजह से सुपर-उपयोगकर्ता द्वारा चलाए जाने वाले एप्लिकेशन नहीं लिखना चाहिए। –

उत्तर

13

मैं इसके लिए जीएनयू रीडलाइन लाइब्रेरी की अनुशंसा करता हूं। यह इनपुट की रेखाएं प्राप्त करने के कठिन काम का ख्याल रखता है, और उपयोगकर्ता को बैकस्पेस, बाएं और दाएं तीर इत्यादि के साथ अपनी लाइन संपादित करने की अनुमति देता है, और ऊपर तीर का उपयोग करके पुराने कमांड को याद करने और यहां तक ​​कि^आर का उपयोग करके पुराने कमांड की खोज करने की अनुमति देता है, आदि। लिनक्स जैसे विशिष्ट यूनिक्स-जैसे वितरण के साथ रीडलाइन स्थापित होती है, लेकिन यदि आपके पास यह नहीं है, तो आप इसे here पा सकते हैं।

संपादित करें: यहाँ एक न्यूनतम ReadLine उदाहरण है:

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

int main(int argc, char ** argv) 
{ 
    while(1) 
    { 
     char * line = readline("> "); 
     if(!line) break; 
     if(*line) add_history(line); 
     /* Do something with the line here */ 
     free(line); 
    } 
} 
-4

आप अपना आवेदन टीसीएल या पायथन एप्लिकेशन के रूप में लिख सकते हैं और उन्हें फ्रंट एंड के रूप में उपयोग कर सकते हैं।

1

आपको कम से कम आंशिक रूप से अपना खुद का रोल करना होगा। जीएनयू रीडलाइन थोड़ा सा मदद करने में सक्षम हो सकता है; एक संक्षिप्त कार्यक्रम के लिए http://en.wikipedia.org/wiki/GNU_readline देखें जो "कंकाल" है जो इसे प्राप्त करता है और जिसके आस-पास आप वास्तव में कोड जोड़ सकते हैं।

1

आपको शायद the readline library पर एक नज़र रखना चाहिए। इसमें एक सीखने की वक्र है, लेकिन यह अभी भी एक पूर्ण सीएलआई को पुनर्निर्माण करने से काफी आसान है। लाइसेंसिंग की जांच करें हालांकि यह आपके प्रोजेक्ट के लिए उचित नहीं हो सकता है।

5

GNU readline पुस्तकालय महान यदि आप पूरी लाइन संपादन और इतिहास सुविधाओं चाहते है, लेकिन अगर एक साधारण शीघ्र suffices (या आप नहीं चाहते हैं जीएनयू लाइसेंस), तो आप सिर्फ मानक पुस्तकालय के साथ ऐसा कर सकते हैं:

#include <iostream> 
#include <string> 

void process(std::string const & line); 

int main() 
{ 
    for (std::string line; std::cout << "APP > " && std::getline(std::cin, line);) 
    { 
     if (!line.empty()) { process(line); } 
    } 

    std::cout << "Goodbye.\n"; 
} 
2

मैं क्रिस की टिप्पणी से सहमत है कि यह एक भाषा है कि चिंतनशील नहीं है में कठिन होगा। सी ++ में, आपको जो कुछ भी आप किसी विशिष्ट फ़ंक्शन पर टाइप करते हैं उसे स्पष्ट रूप से मैप करने की आवश्यकता होगी।

आप अपने खुद के लिए, अपने सामान्य डिजाइन कुछ इस तरह देखना चाहिए रोल करने जा रहे हैं: (सबसे अधिक संभावना एक स्ट्रिंग में cin.getline का प्रयोग करके)

  • पहला शब्द पहचानें

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

    एक प्रतिबिंबित भाषा में, इसका पहला भाग बहुत सरल है क्योंकि आप स्ट्रिंग को सीधे फ़ंक्शन नाम में परिवर्तित करने में सक्षम हो सकते हैं।

  • +1

    मैं 'std :: istream :: getline' पर' std :: getline' की अत्यधिक अनुशंसा करता हूं। – chris

    2

    जीएनयू रीडलाइन अब तक एक उत्कृष्ट चयन है, जैसा कि अन्य ने सुझाव दिया है। यदि लाइसेंसिंग चिंताओं से आप इसे रद्द करने के लिए मजबूर करेंगे, तो आपको linenoise पर विचार करना चाहिए।

    +0

    ऐसा प्रतीत होता है कि लिनेनोइज भी पूर्णता सुविधा प्रदान करता है, जो कि बहुत अच्छा हो सकता है। – etham

    1

    एक थोड़ी देर हो चुकी है, लेकिन जो कुछ भी ...

    बस आप CLI टूलकिट परियोजना कि विशेष रूप से इस जरूरत के लिए डिजाइन किया गया था के बारे में बताने के लिए: http://sourceforge.net/projects/aroyer-cli/

    1

    जीपीएल लाइसेंस के प्रति सचेत रहें जीएनयू रीडलाइन का। उत्तर में, लोगों ने जीएनयू रीडलाइन के जीपीएल लाइसेंस के बारे में उल्लेख किया है। इस जवाब में, मैं जीपीएल लाइसेंस के प्रभावों पर जोर देना चाहता हूं - जो नए उपयोगकर्ता/डेवलपर अनदेखा कर सकते हैं।

    पाठ से जीएनयू ReadLine का लाइसेंस के रूप में जीपीएल के https://en.wikipedia.org/wiki/GNU_Readline

    पसंद की नकल की [संपादित करें] जीएनयू ReadLine एक मुक्त सॉफ्टवेयर पुस्तकालय जो GNU जनरल पब्लिक लाइसेंस (GPL) के अंतर्गत लाइसेंस प्राप्त है होने के लिए उल्लेखनीय है बजाय जीएनयू लेसर जनरल पब्लिक लाइसेंस (एलजीपीएल) का। एलजीपीएल के तहत मुफ्त सॉफ्टवेयर पुस्तकालयों को अक्सर लाइसेंस प्राप्त होता है, उदाहरण के लिए, जीएनयू सी लाइब्रेरी, जीएनयू गेटटेक्स्ट और एफएलटीके।

    एक आवेदन जो एक LGPL से जोड़ने के लिए चुनता है की एक डेवलपर लाइसेंस प्राप्त पुस्तकालय जब निर्माण एक नया आवेदन LGPL लाइसेंस प्राप्त पुस्तकालय जो यह LGPL के अंतर्गत रहने का उपयोग करता है जब संयुक्त जिसके परिणामस्वरूप आवेदन वितरण के लिए आवश्यक है। एलजीपीएल लाइसेंस प्राप्त लाइब्रेरी को छोड़कर संयुक्त एप्लिकेशन का हिस्सा मूल लाइसेंस के तहत रह सकता है। [1] को चुनने वाले डेवलपर के विपरीत यह एक नया एप्लीकेशन बनाने के लिए एक जीपीएल लाइसेंस प्राप्त लाइब्रेरी का उपयोग करें, जिसमें पूरे संयुक्त परिणामी आवेदन को को की धारा 5 के अनुपालन के लिए वितरित किए जाने पर जीपीएल के तहत लाइसेंस प्राप्त करने की आवश्यकता है। जीपीएल। [2] [3]

    जीएनयू ReadLine के जीपीएल लाइसेंस [संपादित करें] एक महत्वपूर्ण उदाहरण एप्लिकेशन को अपना लाइसेंस बदलते copyleft जीएनयू ReadLine के स्थिति CLISP, आम लिस्प के एक कार्यान्वयन है का पालन करने में की के निहितार्थ। मूल रूप से 1 9 87 में जारी किया गया, यह 1 99 2 में जीपीएल लाइसेंस में बदल गया, [4] सीएलआईएसपी के मूल लेखकों में से एक के बीच ईमेल एक्सचेंज के बाद, ब्रूनो हाइबल और रिचर्ड स्टॉलमैन, जिसमें स्टालमैन ने तर्क दिया [5] कि लिंकिंग सीएलआईएसपी में रीडलाइन का मतलब है कि हेल को जीएलएल के तहत पुनः लाइसेंस सीएलआईएसपी की आवश्यकता थी, यदि वह सीएलआईएसपी के कार्यान्वयन को वितरित करना चाहता था जो रीडलाइन का उपयोग करता था। [6]

    वैकल्पिक कमांड लाइन संपादन पुस्तकालयों जो permissively लाइसेंस प्राप्त कर रहे हैं सॉफ्टवेयर परियोजनाओं जो कमांड लाइन संपादन कार्यक्षमता लागू करना चाहते हैं द्वारा इस्तेमाल किया जा सकता है, लेकिन एक अनुमोदक लाइसेंस के तहत रहना चाहते हैं। इनमें से विशिष्ट बीएसडी लाइसेंस प्राप्त libedit है। मारियाडीबी [7] या PHP [8] जैसे कुछ एप्लिकेशन, उपयोगकर्ता को को बिल्ड समय पर चुनने के लिए अनुमति देते हैं कि जीएनयू रीडलाइन से लिंक करें या libedit के साथ। अन्य कमांड लाइन संपादन पुस्तकालय एक दोहरे उद्देश्य प्रदान करते हैं: उनके पास एपीआई है जो कुछ मुख्य परियोजनाओं को संरेखित करती है और संगत लाइसेंस शर्तों के साथ है। इसका एक उदाहरण हैस्कलाइन लाइब्रेरी, जो ग्लासगो हास्केल कंपाइलर [9] और अन्य हास्केल परियोजनाओं के लिए एक हास्केल-संगत एपीआई का खुलासा करता है, जिसके लिए लाइन-संपादन सेवाओं की आवश्यकता होती है। [10]

    ऐसी कई पुस्तकालयों के लिंक बाहरी लिंक में सूचीबद्ध हैं।