2010-11-17 10 views
21

एक सहयोगी ने सिर्फ इस कोड है कि मुझसे कहा:ifstream: यदि खोला जाँच सफलतापूर्वक

std::ifstream stream(filename.c_str()); 
if (!stream) 
{ 
    throw std::runtime_error(".."); 
} 

गलत होगा। उन्होंने कहा कि ifstream खोलने पर 0 का मूल्यांकन करता है। मेरा कोड काम करता है, लेकिन मैं प्रलेखन ढूंढना चाहता था लेकिन यह नहीं देखा कि यह कहां कहता है कि खोलना सफल था या नहीं। क्या आप मुझे इसके बारे में बता सकते हैं?

उत्तर

29

operator!std::ifstream के लिए is overloaded है, तो आप ऐसा कर सकते हैं।

मेरी राय में, हालांकि, यह ऑपरेटर ओवरलोडिंग (मानक समिति द्वारा) का एक भयानक दुर्व्यवहार है। यदि आप if (stream.fail()) करते हैं तो यह अधिक स्पष्ट है कि आप क्या जांच रहे हैं।

+6

'stream.bad()', 'stream.good()', 'stream.fail()', 'stream.is_open()', और 'stream.is_open()' को देखना न भूलें। श्वास ... – Inverse

+0

लिंक के लिए बहुत बहुत धन्यवाद! मैं मानता हूं कि इस ऑपरेटर का उपयोग करके चेक करना अच्छा नहीं है, इसलिए मैं इसे बदल दूंगा। अगर हमने (stream.fail()) के साथ चर्चा नहीं की होगी। – Philipp

+9

द! 'असफल' और 'खराब' चेक करने के लिए ओवरलोड किया गया है –

8

आप यह जांचने के लिए is_open() का भी उपयोग कर सकते हैं कि यह काम करता है, लेकिन! है की अनुमति दी

संपादित करें (यह शून्य के लिए जाँच नहीं कर रहा है, यह एक विशेष overload of ! है):
बस दिलचस्पी की वजह से - क्यों यह एक अपवाद फेंक नहीं है?
क्या यह केवल धाराओं को अपवाद
से पहले पेश किया गया था या हम पुराने सी ++ चीज में हैं - यह केवल एक त्रुटि है जो अपवाद होने के लिए पर्याप्त असाधारण नहीं है।

8

आप उचित बिटमैस्क के साथ ios::exceptions() फ़ंक्शन को कॉल करके किसी भी प्रकार की ईफ/असफल/खराब पर अपवाद फेंक सकते हैं। तो, आप के रूप में ऊपर प्रारंभिक सवाल में उदाहरण के पुनर्लेखन सकता है: जब failbit या badbit सेट हो जाता है

std::ifstream stream; 
stream.exceptions(std::ios::failbit | std::ios::badbit); 
stream.open(filename.c_str()); 

यहाँ धारा एक अपवाद फेंक देते हैं। उदाहरण के लिए यदि ifstream::open() विफल रहता है तो यह असफलता सेट करेगा और अपवाद फेंक देगा। बेशक, यह बाद में एक अपवाद फेंक देगा यदि इनमें से कोई भी बिट स्ट्रीम पर सेट हो जाता है, तो यह पुनः लिखना प्रारंभिक उदाहरण के समान नहीं है। आप

stream.exceptions(std::ios::goodbit); 

धारा पर सभी अपवादों को रद्द करने और त्रुटियों के लिए जाँच करने के लिए वापस जाने के लिए कह सकते हैं।

2

आपका सहयोगी गलत है। शायद वह भूल गया है कि आप सी नहीं लिख रहे हैं।

कोड स्पॉट पर है। यह बिल्कुल आपको स्ट्रीम स्थिति की जांच कैसे करनी चाहिए।

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