2013-04-28 16 views
5

यह प्रश्न: How to protect log from application crash? ने मुझे दूसरे स्थान पर ले जाया है - std::ofstream::close() वास्तव में क्या करता है? मुझे पता है कि यह flush() पर कॉल करता है और यह एक बात है। लेकिन और क्या? वास्तव में फाइल को बंद करना क्या है?std :: ofstream :: close() वास्तव में क्या करता है?

संपादित करें: मुझे मेरे सवाल का अलग तरीके से व्यक्त करते हैं - कुछ भी शारीरिक रूप से close() को वास्तविक फ़ाइल कॉल के दौरान करने के लिए किया या यह सिर्फ std::ofstream आंतरिक सफाई सामान है है?

उत्तर

3

यूज़रस्पेस बफ़र्स निस्तब्धता के अलावा, अर्थात flush(), close(2) अंतर्निहित फ़ाइल वर्णनकर्ता पर कहा जाता है। यह ऑपरेटिंग सिस्टम पर निर्भर करता है कि तब क्या होता है, लेकिन संभवतः फ़ाइल द्वारा कब्जे वाले वास्तविक भंडारण के साथ कुछ भी नहीं होता है।

होगा यह होगा कि (यदि फाइल डिस्क्रिप्टर उस फ़ाइल में उस प्रक्रिया में अंतिम संदर्भ था) फ़ाइल से जुड़ी फ़ाइल प्रविष्टि प्रक्रिया की खुली फ़ाइल तालिका से हटा दी जाती है। अर्थात। मुक्त प्रक्रिया-संबंधित कर्नेल-मेमोरी।


void std::basic_ofstream::close(); 

प्रभावी ढंग से कॉल rdbuf()->close():

1

वर्तमान में ऑब्जेक्ट से जुड़े फ़ाइल को बंद करता है, इसे स्ट्रीम से अलग करता है।

फ़ाइल में कोई लंबित आउटपुट अनुक्रम लिखा गया है।

यदि स्ट्रीम वर्तमान में किसी भी फ़ाइल से संबद्ध नहीं है (यानी, कोई फ़ाइल सफलतापूर्वक इसके साथ नहीं खुलती है), इस फ़ंक्शन को कॉल करने में विफल रहता है।

स्ट्रीम की फ़ाइल एसोसिएशन अपने आंतरिक स्ट्रीम बफर द्वारा रखी जाती है: आंतरिक रूप से, फ़ंक्शन rdbuf() -> close() को कॉल करता है, और विफलता के मामले में विफलता सेट करता है।

ध्यान दें कि ऑफ़स्ट्रीम ऑब्जेक्ट नष्ट होने पर कोई भी खुली फ़ाइल स्वचालित रूप से बंद हो जाती है।

से: http://www.cplusplus.com/reference/fstream/ofstream/close/

+0

मैंने अपना प्रश्न दोहराया है, कृपया मूल पोस्ट का संपादन देखें। – NPS

3

यहाँ प्रलेखन से कॉल का पता लगाने है। यदि ऑपरेशन के दौरान कोई त्रुटि होती है, तो setstate(failbit) कहा जाता है।


std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const; 

जुड़े धारा बफर देता है। यदि कोई संबंधित स्ट्रीम बफर नहीं है, तो NULL लौटाता है।


std::basic_streambuf वास्तव में std::basic_filebuf इनहेरिट करती है, इसलिए:


std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close(); 

पुट क्षेत्र मौजूद हैं (फ़ाइल जैसे लिखने के लिए खोला गया था), पहली कॉल overflow(Traits::eof()) फाइल करने के लिए सभी लंबित उत्पादन लिखने के लिए, किसी भी अशांति अनुक्रम सहित।

सबसे हाल ही में कहा जाता है समारोह, के underflow(), overflow(), seekpos(), और seekoff(), था overflow() बाहर, तो std::codecvt::unshift(), शायद कई बार, कॉल imbued स्थान के अनुसार unshift अनुक्रम यह निर्धारित करने के लिए, और लिखते हैं कि अनुक्रम फाइल करने के लिए तो overflow(Traits::eof()) के साथ।

फिर, std::fclose पर कॉल करके फ़ाइल को बंद कर दिया गया है, भले ही इनमें से कोई भी पिछली कॉल सफल हो या विफल हो।

नोट:।close() आम तौर पर std::basic_filebuf (जो, बारी में, आम तौर पर std::basic_fstream का नाशक से जानी जाती है नाशक के माध्यम से कहा जाता है


सबसे पहले, हम देख सकते हैं कि यह नहीं करता है ' टी वास्तव में flush() सीधे कॉल आप अपेक्षा के अनुरूप। फिर भी, फ्लशिंग प्रभाव वास्तव में std::basic_filebuf::close() विधि में होता है। इसके अलावा, हम देख सकते हैं कि यह अभी भी एक फ़ाइल के साथ छेड़छाड़ यानी unshift अनुक्रम लेखन का एक सा है। बाकी कुछ भी नहीं विशेष तब होता है, फ़ाइल बस बंद हो जाती है। ऊपर नोट को

वेतन ध्यान: ज्यादातर मामलों में आप भी std::basic_ofstream::close() स्पष्ट रूप से कॉल करने के लिए की जरूरत नहीं है।

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