2011-03-19 23 views
11

मैं इस्तेमाल किया "CIN" इनपुट धारा से शब्द, जैसेपाश में स्ट्रिंग एस एस के लिए कोई और इनपुट सूचित करने के लिए कैसे, जबकि (CIN >> ss)

int main(){ 
    string word; 
    while (cin >> word){ 
     //do sth on the input word 
    } 

    // perform some other operations 
} 

कोड संरचना की तरह कुछ है जो पढ़ने के लिए एक से ऊपर यह संकलित है। निष्पादन के दौरान, मैं कुछ

मेरा इनपुट इस इनपुट को समाप्त करने का तरीका है? दूसरे शब्दों में, मान लीजिए कि टेक्स्टफाइल सिर्फ "aa bb cc dd" है। लेकिन मुझे नहीं पता कि कार्यक्रम को कैसे पता चलेगा कि फ़ाइल समाप्त होती है।

उत्तर

17

आपका कोड सही है। यदि आप इंटरैक्टिव रूप से इनपुट कर रहे थे, तो आपको एक ईओएफ चरित्र, जैसे कि CTRL-D भेजना होगा।

जब आप फ़ाइल में पढ़ रहे हों तो इस ईओएफ चरित्र की आवश्यकता नहीं है। ऐसा इसलिए है क्योंकि एक बार जब आप अपनी इनपुट स्ट्रीम के अंत में आते हैं, तो "cin" के लिए कुछ भी नहीं बचा है (क्योंकि स्ट्रीम अब बंद है), इस प्रकार जबकि लूप निकलता है।

+12

यह ध्यान देने योग्य है कि कुंजीपटल से ईओएफ को सिग्नल करने का तरीका ऑपरेटिंग सिस्टम द्वारा भिन्न होता है। एमएस विंडोज़ को एक को CTRL-Z टाइप करने की आवश्यकता होती है जबकि यूनिक्स और संबंधित ऑपरेटिंग सिस्टम को CTRL-D की आवश्यकता होती है। –

+0

@ माइक लुईस आप कोड नमूना प्रदान कर सकते हैं? –

1

Ctrl-Z दबाएं (* nix सिस्टम पर Ctrl-D) और एंटर दबाएं। यह एक ईओएफ भेजता है और स्ट्रीम को अमान्य करता है।

+0

यह प्रक्रिया को रोक देता है। नहीं? – Nawaz

+0

जो लूप को समाप्त करता है। मुझे यकीन नहीं है कि प्रक्रिया से आपका क्या मतलब है। मैं उलझन में हूं, क्या आप किसी फ़ाइल से या मानक से इनपुट ले रहे हैं? या आप इनपुट को रीडायरेक्ट कर रहे हैं jonsca

+1

@ नवाज: नहीं, यह प्रक्रिया को रोक नहीं देता है। आप इसे 'Ctrl-C' से भ्रमित कर सकते हैं। – dappawit

3
int main() { 
    string word; 
    while (cin >> word) { 
     // do something on the input word. 
     if (foo) 
      break; 
    } 
    // perform some other operations. 
} 
0

मुझे लगता है कि आप फ़ाइल के अंत में बाहर निकलना चाहते हैं। आप basic_ios::eof का मान प्राप्त कर सकते हैं, यह स्ट्रीम के अंत में सच हो जाता है।

3

के रूप में दूसरों को पहले से ही इस सवाल का जवाब है, मैं इस महत्वपूर्ण बिंदु को जोड़ने चाहते हैं:

के बाद से Ctrl-Z विंडोज पर (और Ctrl-D यूनिक्स सिस्टम पर) तक पहुँचने के लिए EOF का कारण बनता है, और आप while पाश से बाहर निकलने के , लेकिन while लूप के बाहर आप आगे इनपुट नहीं पढ़ सकते हैं, क्योंकि ईओएफ पहले ही पहुंच चुका है।

तो cin फिर से उपयोग पढ़ना सक्षम करने के लिए, आप eof झंडा स्पष्ट करने की जरूरत है, और अन्य सभी विफलता झंडे, जिन्हें आप नीचे:

cin.clear(); 

यह करने के बाद, आप एक बार फिर से cin का उपयोग कर इनपुट पढ़ना शुरू कर सकते हैं!

+0

बिल्कुल वही जो मैं चाहता था। – Hritik

1

cin >> some_variable_or_manipulator हमेशा cin के संदर्भ में मूल्यांकन करेगा। आप की जाँच करें और अगर वहाँ अधिक इनपुट अभी भी पढ़ने के लिए है देखना चाहते हैं, तो आप इस तरह कुछ करने की जरूरत है:

int main(){ 
    string word; 
    while (cin.good()){ 
     cin >> word; 
     //do sth on the input word 
    } 

    // perform some other operations 
} 

इस धारा के goodbit है, जो सच है जब से कोई भी eofbit, failbit, या करने के लिए सेट कर दिया जाता जाँच करता है बैडबिट सेट हैं। यदि कोई त्रुटि पढ़ने में है, या स्ट्रीम को एक ईओएफ चरित्र प्राप्त हुआ है (फ़ाइल के अंत तक पहुंचने से या सीटीआरएल + डी दबाकर कीबोर्ड पर उपयोगकर्ता से), cin.good() झूठी वापसी करेगा, और आपको बाहर निकाल देगा पाश।

0

फ़ाइल से इनपुट लें। फिर आप पाएंगे कि जब आपका प्रोग्राम इनपुट लेना बंद कर देता है तो थोड़ी देर लूप समाप्त हो जाती है। असल में cin इनपुट प्राप्त करने पर रोकता है जब उसे ईओएफ मार्कर मिल जाता है। प्रत्येक इनपुट फ़ाइल इस ईओएफ मार्कर के साथ समाप्त होती है। जब यह ईओएफ मार्कर operator>> द्वारा सामना किया जाता है तो यह आंतरिक ध्वज eofbit के मूल्य को झूठी में संशोधित करता है और इसके परिणामस्वरूप जबकि लूप रुक जाता है।

0

यह मुझे ENTER मारकर लूप को समाप्त करने में मदद करता है।

int main() { 
    string word; 
    while(getline(cin,word) && s.compare("\0") != 0) { 
     //do sth on the input word 
    } 

    // perform some other operations 
}
-1

आपका प्रोग्राम सफेद रिक्त स्थान पर नहीं लेता है। CIN और getline के बीच अंतर कर ...

यहाँ एक चाल के साथ एक उदाहरण है: कार्यक्रम इनपुट और प्रिंट आउटपुट प्राप्त जब तक आप दो बार छोड़ने के लिए एंटर दबाएं:

#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 


    char c = '\0'; 
    string word; 
    int nReturn = 0; 

    cout << "Hit Enter twice to quit\n\n"; 

    while (cin.peek()) 
    { 
     cin.get(c); 

     if(nReturn > 1) 
      break; 
     if('\n' == c) 
      nReturn++; 
     else 
      nReturn = 0; 
     word += c; 
     cout << word; 
     word = ""; 
    } 

    cout << endl; 
    return 0; 
} 
+0

आपका उत्तर पूरी तरह से असंबंधित है, इसलिए, यह कोई जवाब नहीं है कि यह एक साइड नोट है। – chbchb55

0

आप एक के लिए एक जाँच कर सकते हैं इनपुट में विशेष शब्द। एफ.ई. "रोकें":

int main(){ 
    string word; 

    while (cin >> word){ 
     if(word == "stop") 
      break; 

     //do sth on the input word 
    } 

// perform some other operations 
}