c++ - Extra output when adding trailing spaces and using eof -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 4 जवाब

मैं निम्नलिखित कोड संकलित कर रहा हूं माइक्रोसॉफ्ट विज़ुअल स्टूडियो 2013 के अंतर्गत

  #include & lt; iostream & gt; # शामिल करें & lt; fstream & gt; नेमस्पेस एसटीडी का उपयोग करना; Int main () {ifstream in ("filename.txt"); Int n; जबकि (! In.eof ()) {in & gt; & gt; n; Cout & lt; & lt; N & lt; & lt; endl; } वापसी 0; }  

filename.txt में शामिल है:

  4  

नोट : दूसरी पंक्ति खाली रेखा है।

मुझे यह आउटपुट प्राप्त हो रहा है:

  4 4  

मेरा प्रश्न है: जब मैं फ़ाइल के अंत में रिक्त स्थान या रिक्त पंक्ति जोड़ता हूं, तो आउटपुट में क्यों 4 दोहराया जाता है? और इस मामले में क्यों eof ठीक से काम नहीं कर रहा है?

! Eof () , ! / कोड>, ! Bad () , या ! अच्छा () , आपका इनपुट कंडीशन करने के लिए हमेशा गलत तरीके से है बिंदु निष्कर्षण पहले करने के लिए है, और उसके बाद जांचें अगर सफल हो यदि आप पूर्व करते हैं, तो आप लगभग हमेशा उन समस्याओं को प्राप्त करेंगे जो आप अनुभव कर रहे हैं।

धारा से प्राप्त n प्राप्त 4 में पहली निष्कर्षण। इसे मिलने के बाद नई लाइन बंद हो गई और आपने n के मूल्य को छपाया। जब दूसरे लूप का निष्पादन किया गया, तो चिमटा निकासी ने धारा से अग्रणी सफेद स्थान को मंजूरी दी (अर्थात् 4 के बाद नई लाइन), स्ट्रीम का अंत पाया और eofbit सेट करें चूंकि कोई वर्ण निकाला नहीं गया था, इसलिए यह failbit भी सेट किया गया है। जब आपने मूल्य को फिर से मुद्रित करने का प्रयास किया, तो आप जो भी देख रहे थे वह पिछले इनपुट ऑपरेशन का परिणाम था।

यह एक पढ़ना करने का सही तरीका नहीं है। आपको स्ट्रीम को चेक करना से पहले करना है ऐसा सामान्यतः किया जाता है:

  जबकि (में & gt; & gt; n) {std :: cout & lt; & lt; N & lt; & lt; std :: endl; }  

पढ़ने के बाद, स्ट्रीम पर ऑपरेटर बूल () लागू किया जाएगा, जो अपनी स्ट्रीम राज्य तक पहुंच जाएगा और यह निर्धारित करेगा कि निष्कर्षण सफल हुआ है या नहीं। यदि ऐसा होता है, तो उसके बाद ही लूप बॉडी निष्पादित होगी।


Comments

Popular posts from this blog

c# - Reactive Extensions ControlScheduler -

scala - Play Framework - how to bind form to a session field -

c++ - Why does Visual Studio Release build break on non-executing code line -