2012-12-05 15 views
6

तक पहुंचने के बाद रिटर्न -1 निम्नलिखित कोड जीसीसी 4.4 के साथ काम करता है।
लेकिन जीसीसी 4.7 दावा विफलता देगा।जीसीसी 4.7 आईएसट्रीम :: टेलग() ईओएफ

#include <assert.h> 
#include <iostream> 
#include <sstream> 

using namespace std; 

int main() 
{ 

    string input("abcdefg"); 
    stringstream iss(input); 
    ostringstream oss; 
    oss << iss.rdbuf(); 

    assert (!iss.eof()); 
    (void) iss.peek(); 
    assert (iss.eof()); 

    // the following assertion will fail with gcc 4.7 
    assert(streamoff(iss.tellg()) == 
      streamoff(input.length())); 

    return 0; 
} 

जीसीसी 4.7 में, यदि आईट्रीम ईओएफ तक पहुंच गया है, तो टेलग() वापस आ जाएगा। कोई pubseekoff() न ही seekoff() कहा जाएगा जीसीसी 4.4 में यह कोई समस्या नहीं है।

व्यवहार, जीसीसी 4.4 या जीसीसी 4.7 होना चाहिए? क्यूं कर?

+0

एक छोटी सी उलझन में। निष्कर्षण के बाद 'iss.eof()' सेट क्यों नहीं है? –

+0

यह जीसीसी 4.6 से तय किया गया था, यहां [बग रिपोर्ट है] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26211)। –

+0

उस बग रिपोर्ट में बहुत अधिक विवरण नहीं है। फ़ाइलों को बदल दिया गया था हालांकि वर्तमान मुद्दे से संबंधित हैं। आपने वर्तमान समस्या के साथ उस बग फिक्स को कैसे जोड़ा? –

उत्तर

5

सी ++ धारा 11 27.7.2.3p40 के अनुसार,

अगर fail() != false, रिटर्न pos_type(-1)

तो जीसीसी 4.7 सी के वर्तमान संस्करण के लिए सही व्यवहार है ++ (यह सोचते हैं कि peek() स्ट्रीम के अंत में सेट होने के लिए failbit का कारण बनता है, और यह प्रेषण निर्माण के दौरान होता है, क्योंकि skipws डिफ़ॉल्ट रूप से सेट होता है)।

सी ++ 03 के शब्द को देखते हुए, यह वही है। 27.6.1.3p37। तो जीसीसी 4.4 में वर्णित व्यवहार एक बग है।

1

सटीक होने के लिए, eofbit-1 वापस करने के लिए कारण नहीं होगा। लेकिन तथ्य यह है कि आपने पिछले पढ़ा है EOF failbit सेट करता है, और tellg()-1 वापस badbit या failbit सेट हो जाएगा।

समाधान tellg() कॉल करने से पहले स्थिति झंडे स्पष्ट करने के लिए है:

iss.clear(); 
iss.tellg(); // should work 
संबंधित मुद्दे