2011-06-02 15 views
10

मेरे पास कुछ C++ कोड है जो cout डीबग उद्देश्यों के लिए कथन का उपयोग करता है और किसी कारण से मैं प्रिंट करने के लिए सभी डेटा नहीं प्राप्त कर सकता हूं जब तक कि मैं अंत में std::cout.flush(); नहीं करता।stdout और इसे फ्लश करने की आवश्यकता है C++

मुझे समझ में नहीं आता कि इस फ्लश ऑपरेशन की आवश्यकता क्यों है।

किसी के पास कोई अंतर्दृष्टि है?

+0

कृपया मेरे प्रश्नों को संपादित न करें, धन्यवाद। –

उत्तर

7

अन्य उत्तर में जोड़ने के लिए: अपने डिबगिंग बयानों के बजाय cerr के पास जाना चाहिए, क्योंकि:

  • यह मानक त्रुटि, जिसका मतलब है कि, आवेदन चल रहा है, तो आप आसानी से अलग कर सकते हैं "सामान्य करने के लिए लिखता है "पुनर्निर्देशन के माध्यम से त्रुटियों/डीबग जानकारी से प्रोग्राम आउटपुट;
  • सबसे महत्वपूर्ण बात, cerr डिफ़ॉल्ट रूप से unbuffered जिसका मतलब है कि, प्रत्येक उत्पादन ऑपरेशन के बाद, यह स्वतः ही फ्लश, और सामान्य रूप में यह त्रुटियों और डिबग आउटपुट के लिए वांछनीय है है।

(स्रोत: सी ++ मानक, §27.3.1 ¶4-5, §27.4.2.1.2 तालिका 83)

+0

धन्यवाद, मुझे भविष्य के संदर्भ के लिए यह याद आएगा, मुझे आमतौर पर परवाह नहीं है क्योंकि मैं अपने कोउट स्टेटमेंट को हटा दूंगा लेकिन यह परियोजना एक शाही दर्द रहा है। मुझे तीसरे पक्ष के कोड से नफरत है। –

4

क्या वह डेटा है जो स्वचालित रूप से \n की कमी के कारण फ़्लश नहीं हो रहा है? डिफ़ॉल्ट रूप से, कैरिज रिटर्न देखने तक मानक आउट डिलीवर नहीं होता है।

+0

यदि मैं एक एंडल भेजता हूं तो यह प्रिंट भी करेगा, लेकिन मैंने सी ++ में सोचा कि फ्लश ऑपरेशन के समान ही है? –

+0

कैरिज रिटर्न का उपयोग "फ़्लश प्वाइंट" के रूप में किया जाता है, यदि आप करेंगे। ध्यान रखें कि सी समान अंतर्निहित I/O को C++ के रूप में साझा करता है और सी में अंतराल की कमी होती है, हालांकि \ n अभी भी चाल करता है। std :: endl वास्तव में फ्लश को मजबूर कर सकता है; मुझे यह सुनिश्चित करने के लिए इसके कार्यान्वयन (या किसी के पास सुनना) की जांच करनी होगी। – mah

+1

यह गलत है। मानक आउट * नहीं * लाइन buffered है। जहां बफरिंग शामिल है, 'iostream' 'FILE' से काफी भिन्न रूप से काम करता है। 'std :: cout' को 'फ्लश' (जिसे' std :: endl' द्वारा ट्रिगर किया गया है या 'std :: cin' पर पढ़ने के द्वारा) द्वारा स्पष्ट कॉल द्वारा फ़्लश किया जाएगा, या कार्यान्वित द्वारा निर्धारित अन्य अनिर्दिष्ट समय पर । 'Iostream' में कोई लाइन बफरिंग नहीं है। –

1

"जब आप किसी स्ट्रीम में आउटपुट भेजते हैं, तो यह तुरंत मुद्रित नहीं होता है। बल्कि, यह कुछ बकाया घटना तक बफर में इंतजार कर सकता है, उदाहरण के लिए पर्याप्त पूर्ण बफर, इनपुट से पढ़ना, या प्रोग्राम से बाहर निकलना। विवरण भिन्न हो सकते हैं।"

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

+0

तो क्या इसका मतलब यह है कि आउटपुट अप्रत्याशित हो सकता है और मुझे वास्तव में स्ट्रीम पर कोई त्रुटि या डेडलॉक नहीं है? –

+0

बिल्कुल सही। पूरी भविष्यवाणी के लिए इसे फ्लश करें। :) –

0

यह सही व्यवहार है। आप शायद std::endl का उपयोग करें जो \n जोड़ें और बफर को फ्लश करें। http://www.cplusplus.com/reference/ostream/endl/

यदि आप आउटपुट देखना चाहते हैं तो आपको स्ट्रीम फ्लश करने की आवश्यकता है।

0

सी ++ में आप endl फॉर्मेटर cout ऑपरेटर के साथ flush का उपयोग कर सकते हैं।

9

आप std::endl का उपयोग कर अपने लाइनों को समाप्त करने के हैं। यह सामान्य अभ्यास होना चाहिए, जब तक प्रदर्शन समस्याओं को अन्यथा आवश्यक न हो, लेकिन कुछ कारण के लिए, मुझे बहुत सारे कोड दिखाई देते हैं जो '\n' का उपयोग करते हैं।

अन्यथा, आप कभी कर सकते हैं:

std::cout.setf(std::ios_base::unitbuf); 

main में पहली चीजों में से एक के रूप में। यह पर प्रत्येक << के अंत में फ्लश का कारण बन जाएगा, जो आपको चाहिए, लेकिन डायग्नोस्टिक कंसोल पर आउटपुट के लिए, शायद काफी स्वीकार्य है।

+0

हां, मैं आदत के रूप में करता हूं, लेकिन कुछ कोड जो मैं एकीकृत कर रहा हूं वह नहीं है और यह मेरे लिए "सही" करने के लिए बड़ा है .. –

+0

@ डिक्सन स्टील मुझे लगता है। यही कारण है कि मैंने 'यूनिटबफ' का उपयोग करके दूसरा सुझाव दिया। –

0

std::endl का उत्तर केवल तभी मान्य है यदि आप वापसी चाहते हैं। यह सुनिश्चित नहीं है कि आप कमांड प्रॉम्प्ट को फ़्लश करना चाहते हैं तो आप यह कैसे करेंगे।

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