2010-02-26 20 views
11

मै मैकॉक्स पर हूं।सी ++ std :: ऑफस्ट्रीम फ्लश() लेकिन बंद नहीं है()

मेरे आवेदन के लॉगर भाग में, मैं डेटा को एक फ़ाइल में डंप कर रहा हूं।

लगता है मैं एक विश्व स्तर पर std::ofstream outFile("log");

घोषणा की है और मेरे लॉगिंग कोड में मेरे पास है:

outFile << "......." ; 
outFile.flush(); 

अब, फ्लश के बाद मेरे कोड दुर्घटनाओं() होता है लगता है; flush() डिस्क पर लिखे जाने की गारंटी से पहले outFile पर लिखा गया सामान है (ध्यान दें कि मैं close() पर कॉल नहीं करता हूं)।

धन्यवाद!

+0

'आउटफाइल <<" ....... "<< std :: flush;' अधिक पठनीय कोड है। –

उत्तर

11

सी ++ रनटाइम के दृष्टिकोण से, यह डिस्क पर लिखा जाना चाहिए था। एक ओएस परिप्रेक्ष्य से यह अभी भी एक बफर में रह सकता है, लेकिन अगर आपकी पूरी मशीन दुर्घटनाग्रस्त हो जाती है तो यह केवल एक मुद्दा होगा।

2

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

0

जब तक फ्लश() वापस आ गया है, तो आपके प्रोग्राम ने ओएस के हाथों में आउटपुट सफलतापूर्वक डाल दिया है। जब तक ओएस (या डिस्क) दुर्घटनाग्रस्त न हो जाए, तब तक डिस्क आपके डेटा डिस्क पर होनी चाहिए जब अगली बार डिस्क लिखती है (ध्यान दें कि डिस्क की संभावना एक ठोस स्थिति कैश है)।

फ्लश() रिटर्न तक, यह किसी का अनुमान है कि यह डिस्क पर कितना होगा।

6

एक वैकल्पिक दृष्टिकोण के रूप में, आप

outFile.rdbuf()->pubsetbuf(0, 0); 

एक unbuffered fstream को लेखन प्रदर्शन चोट सकता है, लेकिन मापने समय से पहले अनुकूलन हो रहा था जब कि के बारे में चिंता के साथ पूरी तरह बफरिंग निष्क्रिय कर सकते हैं।