2012-09-27 10 views
6

सी ++ में, क्या कोई ऐसा मामला है जहां std::ifstream open() सफल हो सकता है, लेकिन std::ifstream good() गलत हो सकता है?सफलतापूर्वक खोलें लेकिन अच्छा नहीं है?

संपादित करें: जी के साथ परीक्षण किया ++ 4.7.1

#include <iostream> 
#include <fstream> 
int main(int argc, char *argv[]) 
{ 
    std::ifstream filestream("testfile"); 
    std::cout<<filestream.good()<<std::endl; 
    std::cout<<filestream.eof()<<std::endl; 
    std::cout<<filestream.fail()<<std::endl; 
    std::cout<<filestream.bad()<<std::endl; 
    return 0; 
} 

वापस आ जाएगी: 1, 0, 0, 0 जो good = TRUE और eof = fail = bad = FALSE का मतलब है एक खाली फ़ाइल के लिए। क्या यह सामान्य है ?

उत्तर

3

मानक में वास्तविक पाठ की पुष्टि करने के बाद, मुझे नहीं लगता कि eofbit के बाद एक open सेट किया जा करने की अनुमति है इस मामले में क्या होना चाहिए); failbit सेट किया जाना चाहिए यदि खुला विफल रहता है, या यदि खुले के बाद की तलाश है (यदि ate सेट है) विफल रहता है; लेकिन ऐसा कोई प्रतीत नहीं होता है जहां eofbit सेट किया जा सकता है।

यह नहीं कि std::istream::good() पर कॉल करना इस मामले में एक अच्छा समाधान है। (यह पता है कि ओपी प्राप्त करने के लिए कोशिश कर रहा है दिलचस्प होगा। जो भी हो, बुला std::istream::good() शायद सही समाधान नहीं है।)

std::ifstream::good() तो रिटर्न false, अगले इनपुट असफल हो जायेगी। यदि यह true देता है, तो यह आपको कुछ भी नहीं बताता है: अगला इनपुट सफल हो सकता है, लेकिन यह भी असफल हो सकता है।

+0

+1 कार्यान्वयन वास्तव में फ़ाइल का परीक्षण नहीं कर सकता है जब तक आप एक पठन का प्रयास न करें और वह पढ़ना विफल हो जाए। –

+0

@ डेविडरोड्रिगुएज़-ड्राईबीस सामान्य रूप से, इनपुट विफल होने तक 'eofbit' का परीक्षण करने का कोई अर्थ नहीं होता है। और तथ्य यह है कि 'std :: ifstream :: good() '' eofbit' का परीक्षण करता है (अन्य स्थिति बिट्स के अतिरिक्त) इसे बहुत अधिक बेकार बनाता है। –

+0

मुझे नहीं लगता कि 'अच्छा' का उपयोग कर प्रश्नकर्ता में कोई * नुकसान * है? यह सिर्फ इसलिए है कि 'eofbit' सेट नहीं है, इसलिए आप सामान्य की तरह सत्य की स्ट्रीम भी कर सकते हैं। मुझे लगता है कि कुछ बेकार असामान्य करने में पठनीयता हानि है, और जैसा कि आप कहते हैं कि 'अच्छा' का कोई भी उपयोग निर्विवाद रूप से असामान्य है ... –

2

यदि फ़ाइल खाली है तो eofbit ट्रिगर हो जाएगा लेकिन फ़ाइल अभी भी खुली होगी। वास्तविक खुला एक अपवाद फेंकता है तो badbit सेट किया जा सकता है (मेरे विचार — मानक वास्तव में कहना नहीं है:

+0

मेरे समझ तथ्यों की रिपोर्टिंग के रास्ते में हो जाता है था कि eofbit है नहीं लगता है केवल तभी सेट करें जब कोई ऑपरेशन फ़ाइल के अंत से पहले पढ़ने का प्रयास करता है। क्या यह गलत है? – templatetypedef

+0

@templatetypedef मुझे यकीन नहीं है। यह निश्चित है कि फ़ाइल खाली होने पर कार्यान्वयन की आवश्यकता नहीं है, लेकिन मुझे यकीन नहीं है कि इसकी अनुमति नहीं है। यदि 'eofbit' सेट है, तो इसका मतलब है कि अगला इनपुट विफल हो जाएगा क्योंकि कोई डेटा नहीं है। (यदि 'eofbit' सेट नहीं है, तो इसका मतलब कुछ भी नहीं है।) –

+1

यह मानक के मेरे रीडिंग के अनुसार गलत है।अंतर्निहित फ़ाइल बफर की 'खुली() 'सफल होने पर फ़ाइल स्ट्रीम में सभी स्टेटस बिट साफ़ हो जाते हैं। फ़ाइल बफर 'खुला()' विफल होने पर स्थिति 'विफलता' पर सेट की जाती है। किसी भी तरह से, फ़ाइल स्ट्रीम 'ओपन() 'पर कॉल के बाद' eofbit' स्पष्ट हो जाएगा। –

1

ifstream::open शून्य लौटाता है, इसलिए सावधान रहें कि यह कहकर "सफल" कहकर आपका क्या मतलब है।

मानक कहते हैं basic_ifstream::open (27.9.1.9) के लिए:

प्रभाव: rdbuf कॉल() -> खुला (रों, मोड | ios_base :: में)। कि समारोह एक अशक्त सूचक स्पष्ट() कॉल वापस नहीं करता है, तो अन्यथा, setstate (failbit) (जो ios_base फेंक सकता है :: विफलता)

तो कॉल filebuf पर खोलने के लिए कॉल एक मान देता है सफलता का संकेत देते हुए, ifstream::open सभी त्रुटि बिट्स को साफ़ करता है, और इसलिए good() आवश्यक रूप से सत्य लौटाता है।

यदि फ़ाइलबफ पर खोलने के लिए कॉल विफलता इंगित करने वाला मान देता है, तो ifstream::open फिर भी अपवाद फेंकने के बिना वापस आ सकता है। इस व्यवहार को "सफलता" के साथ भ्रमित किया जा सकता है, लेकिन इस मामले में good() झूठी वापसी करता है क्योंकि विफलता सेट है।

यह पूरी तरह से मेरे लिए स्पष्ट नहीं क्यों इस badbit से failbit सेट बल्कि है, लेकिन मैं समझ की मेरी कमी :-)

संबंधित मुद्दे

 संबंधित मुद्दे