2009-04-14 12 views
138

क्या मुझे पर मैन्युअल रूप से कॉल करने की आवश्यकता है जब मैं std::ifstream का उपयोग करता हूं?क्या मुझे ifstream मैन्युअल रूप से बंद करने की आवश्यकता है?

उदाहरण के लिए, कोड में:

std::string readContentsOfFile(std::string fileName) { 

    std::ifstream file(fileName.c_str()); 

    if (file.good()) { 
     std::stringstream buffer; 
     buffer << file.rdbuf(); 
     file.close(); 

     return buffer.str(); 
    } 
    throw std::runtime_exception("file not found"); 
} 

मैं file.close() मैन्युअल कॉल करने के लिए की जरूरत है? ifstream फाइलों को बंद करने के लिए RAII का उपयोग नहीं करना चाहिए?

उत्तर

182

नहीं

यह वही है आरए II के लिए है, नाशक अपना काम करने देना है। इसे मैन्युअल रूप से बंद करने में कोई हानि नहीं है, लेकिन यह सी ++ तरीका नहीं है, यह वर्गों के साथ सी में प्रोग्रामिंग है।

यदि आप किसी फ़ंक्शन के अंत से पहले फ़ाइल को बंद करना चाहते हैं तो आप हमेशा नेस्टेड स्कोप का उपयोग कर सकते हैं।

मानक (27.8.1.5 कक्षा टेम्पलेट basic_ifstream) में, ifstream को वास्तविक फ़ाइल हैंडल रखने वाले basic_filebuf सदस्य के साथ कार्यान्वित किया जाना है। यह एक सदस्य के रूप में आयोजित किया जाता है ताकि जब एक आईस्ट्रीम ऑब्जेक्ट नष्ट हो जाए, तो यह basic_filebuf पर विनाशक को भी बुलाता है। और मानक (27.8.1.2) से, कि नाशक फ़ाइल बंद कर देता है:

virtual ˜basic_filebuf();

प्रभाव: वर्ग basic_filebuf<charT,traits> की एक वस्तु को नष्ट कर। कॉल close()

+12

+1 - कम से कम एक जो जानता है कि आरएआईआई का क्या अर्थ है :-) – Milan

+3

+1 मुझे नहीं पता था कि आरएआईआई इसे संभालती है ... मुझे लगता है कि आप रोजाना कुछ नया सीखते हैं – TStamper

+13

फ़ाइल को बंद करने के लिए एक नेस्टेड स्कोप का उपयोग करना है पूरी तरह से कृत्रिम - यदि आप इसे बंद करना चाहते हैं, तो उस पर नज़दीकी() कॉल करें। –

43

क्या आपको फ़ाइल को बंद करने की आवश्यकता है?
नहीं

क्या आपको फ़ाइल बंद करनी चाहिए?
निर्भर करता है।

क्या आप संभव त्रुटि शर्तों के बारे में परवाह करते हैं जो फ़ाइल सही तरीके से बंद होने में विफल हो सकती है? याद रखें कि बंद कॉल सेट (विफलता) अगर यह विफल हो जाता है। विनाशक आपके लिए RAII के कारण स्वचालित रूप से आपके लिए निकट() कॉल करेगा, लेकिन आप असफल बिट का परीक्षण करने का एक तरीका नहीं छोड़ेंगे क्योंकि ऑब्जेक्ट अब मौजूद नहीं है।

4

नहीं, यह स्वचालित रूप से ifstream विनाशक द्वारा किया जाता है। एकमात्र कारण आपको इसे मैन्युअल रूप से कॉल करना चाहिए, क्योंकि fstream उदाहरण का एक बड़ा दायरा है, उदाहरण के लिए यदि यह एक लंबे जीवन वर्ग वर्ग का सदस्य चर है।

+0

एक और कारण फाइल-क्लोजिंग त्रुटियों की जांच करना और फेंकने वाले विनाशक को रोकने के लिए हो सकता है, अगर अपवादों की अनुमति है धारा के साथ। –

8

मैं @ मार्टिन से सहमत हूं। यदि आप फ़ाइल में लिखते हैं, तो डेटा अभी भी बफर पर बैठा हो सकता है और close() कहलाता है जब तक फ़ाइल में लिखा नहीं जा सकता है। इसे मैन्युअल रूप से किए बिना, आपको पता नहीं है कि कोई त्रुटि हुई है या नहीं। किसी उपयोगकर्ता को त्रुटियों की रिपोर्ट नहीं करना बहुत बुरा अभ्यास है।

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

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