वास्तव में, एक bool
पढ़ने में प्रयुक्त किया operator>>
अधिभार केवल 0
या 1
के रूप में मान्य इनपुट के एक मूल्य के लिए अनुमति देता है। ऑपरेटर अधिभार num_get
वर्ग टेम्पलेट, जो इनपुट धारा से अगले संख्या पढ़ता को defers और फिर प्रकार कार्य करता है (सी ++ 11 §22.4.2.1/6):
के लिए मूल्य हैं संग्रहीत किया जाना 0
है false
संग्रहित है।
यदि मान 1
है तो true
संग्रहीत है।
अन्यथा true
संग्रहीत किया जाता है और ios_base::failbit
err
को सौंपा गया है।
(err
यहां धारा जहाँ से आप पढ़ रहे हैं की त्रुटि स्थिति है;। इस मामले में cin
नोट है कि वहाँ व्यवहार को निर्दिष्ट अतिरिक्त भाषा जब boolalpha
जोड़तोड़ प्रयोग किया जाता है, जो करने के लिए अनुमति देता है बूलियन्स डाला जा और निकाले उनके नाम, true
और false
उपयोग करते हुए;। मैं संक्षिप्तता के लिए इन अन्य विवरण दर्ज नहीं हुए)
जब आप शून्य या एक, असफल राज्य धारा है, जो आगे निष्कर्षण का कारण बनता है पर सेट हो जाता है के अलावा अन्य एक मूल्य के इनपुट असफल होना। answer
true
पर सेट है और हमेशा के लिए true
रहता है, जो अनंत लूप का कारण बनता है।
यह निष्कर्ष निकालने के बाद कि आप निष्कर्षण सफल रहे हैं और क्या स्ट्रीम अभी भी एक अच्छी स्थिति में है, आपको प्रत्येक निष्कर्षण के बाद स्ट्रीम की स्थिति का परीक्षण करना होगा। उदाहरण के लिए, आप अपने लूप को फिर से लिख सकते हैं:
bool answer = true;
while (std::cin && answer)
{
std::cout << "\nInput?\n";
std::cin >> answer;
}
स्रोत
2012-05-31 00:04:58
+1 एक अच्छी तरह से पूछे जाने वाले प्रश्न के लिए +1।बूलियन एक लाल हेरिंग है; असली मुद्दा स्ट्रीम इनपुट कार्यों के तरीके से करना है। एक चीज को एक int के साथ आज़माएं, और उसके बाद एक अक्षर दर्ज करें और देखें कि क्या होता है ;-) – Cameron
शायद मैं गलत हूं लेकिन जब आप इनपुट फॉर्म कमांड लाइन लेते हैं ... क्या यह एक स्ट्रिंग नहीं बनता है और इसलिए आप वास्तव में हैं स्ट्रिंग और बूलियन के बीच कनवर्ट करना? जो चीजों को पेंच कर सकता है .... –
कैमरून एक अच्छा मुद्दा बनाता है: एक चरित्र को एक पूर्णांक में परिवर्तित किया जा सकता है। उदाहरण के लिए, 'ए' == 65', लेकिन वही बात होती है। – chris