2010-03-26 20 views
8

यहाँ कोड है।समस्या CIN दो बार

उस पर कुछ समय बिताने के बाद, मुझे पहली कॉल "सिने >> स्ट्र" के बाद एहसास हुआ, ऐसा लगता है कि \ n 'अभी भी cin में संग्रहित है (cin.peek() को जांचने के लिए), जो तुरंत गेटलाइन समाप्त होता है । समाधान पहले उपयोग के बीच एक और पंक्ति जोड़ देगा और दूसरा: cin.ignore(numeric_limits::max(), '\n');

हालांकि, मुझे अभी भी समझ में नहीं आता है, पहले कॉल के बाद '\ n' क्यों छोड़ा गया है? Istream & ऑपरेटर क्या करता है >> वास्तव में करते हैं?

+1

कुछ और खुदाई से पता चलता है कि कैसे सूक्ष्म वर्णन किया जा सकता है का उपयोग करके निर्धारित किया जा सकता है: "निकालना समाप्त होता है जब ** अगले ** चरित्र या तो एक वैध खाली स्थान या एक अशक्त चरित्र, या यदि अंत- है ऑफ-फाइल पहुंची है। " –

उत्तर

1

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

7

\noperator>> के अनुसार इनपुट स्ट्रीम में std::string के लिए परिभाषित किया गया है। std::string इनपुट स्ट्रीम से वर्णों से भरा हुआ है जब तक एक व्हाइटस्पेस वर्ण नहीं मिलता है (इस मामले में \n), जिस बिंदु पर भरना बंद हो जाता है और व्हाइटस्पेस अब इनपुट स्ट्रीम में अगला चरित्र है।

cin>>str के बाद cin.get() पर कॉल करके आप \n को भी हटा सकते हैं। हालांकि, इस विशेष I/O बिल्ली को स्किन करने के कई अलग-अलग तरीके हैं। (शायद एक में और स्वयं का अच्छा सवाल?)

+5

पिछली सफेद जगहों से छुटकारा पाने का एक बेहतर तरीका शायद 'std :: cin >> str >> std :: ws; 'करना होगा। – sbi

+1

कुछ परीक्षण चलाएं, यह समझने की समस्या नहीं है कि इसे std::string के लिए कैसे परिभाषित किया गया है। वास्तव में, ऑपरेटर >> धारा में नई लाइन छोड़ देता है जो भी चर का पालन कर रहा है। लेकिन सफेद जगह से छुटकारा पाने की चर्चा शुरू करने के लिए धन्यवाद! –

2

के रूप में अन्य लोगों ने कहा कि, इस मामले की छानबीन चल रहे हैं, वें समस्या है कि नई निकासी पहले निष्कर्षण से छोड़ी गई है। एक समाधान मैं क्या धारा में सब छोड़ दिया पात्रों त्यागने के लिए है:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
2

मैं आम तौर पर केवल std :: CIN से लाइन उन्मुख इनपुट करने की सलाह देते। तो, आपका कोड इस तरह कुछ दिख सकता है:

string str; 
int val; 
// Read an entire line and parse an integer from it 
{ 
    string line; 
    getline(cin, line); 
    istringstream iss(line); 
    iss >> val; 
} 
cout<<"first input:"<<val<<endl; 
getline(cin, str); 
cout<<"line input:"<<str<<endl; 

त्रुटि जांच भी जोड़ना सुनिश्चित करें।

गेटलाइन-केवल दृष्टिकोण इनपुट के लाइन बफरिंग, इनपुट को साफ़ करने, आदि के बारे में सोचने से बचाता है। यदि आप सीधे >> के साथ कुछ पढ़ते हैं, तो इनपुट समाप्त नहीं होता है अगर उपयोगकर्ता इनपुट करने के बजाय एंटर दबाता है आवश्यक है, लेकिन इसके बजाय एक टोकन इनपुट होने तक जारी रहता है (यह व्यवहार आमतौर पर नहीं चाहता था)।

0

इसके अलावा सबसे उपयुक्त समाधान खोज रहा था। इस ऑपरेटर के कार्यान्वयन में समस्याएं पैदा हो सकती हैं। और पूरी लाइन को पढ़ने के लिए हमेशा स्वीकार्य नहीं है, या एक इनपुट लाइन में विभिन्न प्रकारों को मिश्रण नहीं करते हैं।

समस्या को हल करने के लिए, जब आप cin से कुछ डेटा को पढ़ने के लिए चाहते हैं, और अगर व्हाइटस्पेस सही ढंग से पिछले इनपुट ऑपरेशन के बाद निकाला गया था पता नहीं है, तो आप इस तरह कर सकते हैं:

std::string str; 
std::cin >> std::ws >> str; 

लेकिन आप कर सकते हैं ' नए इनपुट को प्रभावित न करने के लिए अंतिम इनपुट ऑपरेशन के बाद पिछली इनपुट ऑपरेशन को साफ़ करने के लिए इसका उपयोग करें, क्योंकि std::ws सभी सफेद जगहों का उपभोग करेगा और पहले गैर-डब्ल्यूएस वर्ण या EOF तक नियंत्रण वापस नहीं करेगा, इसलिए एंटर दबाएगा इनपुट प्रक्रिया। इस मामले में

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

जो अधिक लचीला है किया जाना चाहिए।

पीएस अगर max() फ़ंक्शन जैसे "पहचानकर्ता अपेक्षित" के साथ त्रुटियां मिलीं, तो यह कुछ शीर्षलेख (उदाहरण के लिए, माइक्रोसॉफ्ट द्वारा) max मैक्रोज़ के कारण हो सकती है; इस

#undef max 
संबंधित मुद्दे