2015-10-09 6 views
12

यदि मेरे पास std::ofstream है जो खोला गया हो या नहीं हो सकता है, तो क्या यह close पर ध्यान देने योग्य है? अन्य शब्दों में close()!is_open() पर कुछ भी बुरा (फेंक अपवाद, आदि) करें। उदाहरण के लिएक्या आप सुरक्षित रूप से ऐसी फ़ाइल बंद कर सकते हैं जिसे कभी खोला नहीं गया था?

std::ofstream out; 
if (some_condition) 
{ 
    out.open(path, std::ios::out); 
} 

बाद मैं फ़ाइल के साथ किया हूँ, मैं सिर्फ कह सकते हैं

out.close(); 

या मैं पहले की जाँच करनी चाहिए

if (out.is_open()) 
    out.close(); 

cppreference पर std::basic_fstream::close का ही वर्णन

है

assoc बंद करता है iated फ़ाइल।
प्रभावी रूप से rdbuf()->close() पर कॉल करता है। यदि ऑपरेशन के दौरान कोई त्रुटि होती है, तो setstate(failbit) कहा जाता है।

+2

आप ऑब्जेक्ट को केवल दायरे से बाहर जाने दे सकते हैं ... –

+1

आम तौर पर मैं यही करता हूं, यही कारण है कि मुझे 'std :: ofstream' पसंद है, लेकिन इस विशेष मामले में मैं फ़ाइल को पहले बंद करना चाहता हूं अन्यथा यह होगा। – CoryKramer

+2

यदि आप ['std :: ofstream :: close'] (http://www.cplusplus.com/reference/fstream/ofstream/close/) के लिए cppreference को देखते हैं, तो आप देखेंगे कि 'बंद करने का विशिष्ट उदाहरण एक खुली फ़ाइल पर इस्तेमाल नहीं किया जाता है। संक्षेप में, कुछ भी बुरा नहीं होता है, यह केवल असफलता सेट करता है ताकि आप 'स्ट्रीम' के साथ कुछ भी करने का प्रयास कर सकें, बाद में समस्याएं हो सकती हैं। –

उत्तर

14

यह cppreference वास्तव में क्या कहते हैं कि यह होगा करता है: failbit का गठन किया जाएगा, और आप विधि असफल() के साथ निरीक्षण कर सकते हैं। उदाहरण के लिए, निम्नलिखित प्रिंट "\ n असफल":

#include <iostream> 
#include <fstream> 
int main(int argc, char ** argv) 
{ 
     std::ofstream out; 
     out.close(); 
     if (out.fail()) 
       std::cout << "fail" << std::endl; 
     return 0; 
} 

ऑपरेटिंग सिस्टम के साथ बातचीत के संदर्भ में, वहाँ कुछ भी नहीं बंद करने के लिए है, लेकिन यह अन्यथा हानिरहित है।

8

सी ++ मानक से, § 27.9.1.4 [filebuf.members], पैरा 6:

basic_filebuf<charT,traits>* close();
    प्रभाव:। यदि is_open() == false, एक अशक्त सूचक है & hellip रिटर्न;

6

हां, आप फ़ाइल हमेशा close() फ़ाइल कर सकते हैं, यहां तक ​​कि फ़ाइल भी नहीं खोली गई है। कोई फर्क नहीं पड़ता LINUX या Windows, मैं हमेशा close() सोचने के बिना कि वे खोले गए हैं या नहीं।

लिनक्स से:

void 
close() 
{ 
    if (!_M_filebuf.close()) 
     this->setstate(ios_base::failbit); 
} 
+0

है जिसका मतलब है libstdC++? – edmz

+0

हां। इंडेंटेशन वायर्ड किया गया है क्योंकि libstdC++ को –

+3

लिनक्स की तरह स्वरूपित किया गया है और विंडोज के पास इसके साथ कुछ भी करने की ज़रूरत नहीं है। सवाल सी ++ के बारे में है। – EJP

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

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