हालाँकि, C ++ प्रोग्रामर ध्यान दें कि हमेशा ऐसा होता है कि Cin.eof () अंतिम पंक्ति को दो बार पढ़ने के बाद "सही" वापस नहीं करता है।
जो हो रहा है, वह नहीं है। eofbitबूलियन के लिए रूपांतरण में एक भूमिका निभाता ( stream::operator bool(या operator void*पुराने C ++))। केवल badbitऔर failbitशामिल हैं।
मान लीजिए आप एक फाइल पढ़ रहे हैं जिसमें व्हाट्सएप द्वारा अलग किए गए नंबर हैं। चारों ओर आधारित एक लूप cin.eof()अनिवार्य रूप से गलत होगा या ifपरीक्षणों से भरा होगा । आप EOF तक नहीं पढ़ रहे हैं। आप नंबर पढ़ रहे हैं। तो अपने कोड को उस तर्क को व्यक्त करें:
while (stream >> some_var) {
process_value(some_var);
}
यह काम करेगा कि फ़ाइल की अंतिम पंक्ति के साथ 0 42\nया बस समाप्त होती है 0 42(फ़ाइल में अंतिम पंक्ति के अंत में कोई नई पंक्ति नहीं)। यदि फ़ाइल के साथ समाप्त होता है 0 42\n, तो अंतिम अच्छा पढ़ा गया मान 42 मान लेगा और लाइन मार्कर के अंतिम छोर को पढ़ेगा। ध्यान दें कि ईओएफ मार्कर अभी तक पढ़ा नहीं गया है। फ़ंक्शन के process_valueसाथ कहा जाता है 42। धारा निष्कर्षण ऑपरेटर >> के बगल में कॉल EOF पढ़ता है, और कुछ भी नहीं है के बाद से निकाला गया है, दोनों eofbitऔर failbitस्थापित किया जाएगा।
दूसरी ओर, मान लीजिए कि फ़ाइल समाप्त होती है 0 42(अंतिम पंक्ति के अंत में कोई नई पंक्ति नहीं)। अंतिम अच्छा पढ़ा हुआ ईओएफ मार्कर पर मूल्य 42 को समाप्त कर देगा। संभवतः आप उस 42 को संसाधित करना चाहते हैं। यही कारण है कि eofbitइनपुट स्ट्रीम बूलियन रूपांतरण ऑपरेटर में कोई भूमिका नहीं निभाता है। स्ट्रीम निष्कर्षण ऑपरेटर >> के लिए अगले कॉल पर, अंतर्निहित मशीनरी जल्दी से देखती है कि eofbitयह पहले से ही सेट है। यह जल्दी से स्थापित करने में परिणाम है failbit।
कोड का पहला टुकड़ा हमेशा ठीक से काम करने में विफल क्यों होता है?
क्योंकि आपको लूप स्थिति के रूप में ईओएफ के लिए जाँच नहीं करनी चाहिए। लूप स्थिति को व्यक्त करना चाहिए कि आप क्या करने की कोशिश कर रहे हैं, जो (उदाहरण के लिए) है, एक धारा से संख्याओं को निकालना।