2011-05-17 10 views
7
#include <iostream> 
using std::cout; 
using std::endl; 
using std::cerr; 
#include <cstdio> 

int main() 
{ 
    char pbuffer[BUFSIZ]; 
    setbuf(stdout, pbuffer); 
    cout << "hello cout" ; 
    sleep(5); 
    cerr << "hello cerr"; 
    sleep(5); 
    cout << "\nAll done " << endl; 
    sleep(5); 
    return 0; 
} 

के बफर flushes के बाद मैं संकलन और उपरोक्त कार्यक्रम चलाने के लिए, यह उत्पादन होता है है:क्यों cerr अदालत

hello couthello cerr 
All done 

लेकिन मुझे लगता है यह होना चाहिए:

hello cerrhello cout 
All done 

मैं करना चाहते हैं पता है, क्यों cerrcout के बफर को फहराता है?

+0

'cout <<" हैलो कोउट ";' सीर << "हैलो सीर" से पहले आता है; ' – iammilind

+0

मैं जानना चाहता हूं कि क्यों सीओटी का उत्पादन सीर से पहले आता है। मुझे लगता है कि कोउट का उत्पादन buffered है, सीर का उत्पादन पहले – wildpointercs

उत्तर

7

यह डिज़ाइन द्वारा है।

cin और cerrcout से बंधे हैं, और अपने स्वयं के संचालन से पहले cout.flush() को कॉल करते हैं।

विचार शायद यह है कि इनपुट और आउटपुट उचित क्रम में होना चाहिए।

+0

बाहर आना चाहिए यह गलत है। 'cout'' cin' से जुड़ा हुआ है, लेकिन यह सब कुछ है। 'cerr' किसी भी चीज़ से बंधे नहीं है, और इसमें कुछ भी बंधी नहीं है। (इसका मतलब यह नहीं है कि कार्यान्वयन अन्य सिंक्रनाइज़ेशन तंत्र का उपयोग नहीं कर रहा है। लेकिन 'cerr.tie() 'को एक शून्य सूचक वापस करने की आवश्यकता है।) –

+0

एक त्वरित जांच से पता चलता है कि वीसी 8 में कोई त्रुटि है:' cerr.tie() 'गैर-शून्य लौटाता है, भले ही यह स्पष्ट रूप से C++ मानक द्वारा प्रतिबंधित है। (g ++ इसे सही हो जाता है।) –

+0

@ जेम्स - मसौदे की मेरी प्रति में यह कहता है "ऑब्जेक्ट सीर शुरू होने के बाद, 'cerr.flags() और unitbuf' nonzero और' cerr.tie() 'रिटर्न' और cout' है । " (27.4.2) –

7

सबसे पहले, जब भी ऐसा लगता है तो स्ट्रीम को फ्लश करने की अनुमति है। मैं संभव हूं कि iostream के कुछ कार्यान्वयन एक इंटरैक्टिव डिवाइस पर आउटपुट करते समय बफरिंग नीतियों को बदल दें। जब तक आप जानबूझकर दो धाराओं पर आउटपुट के बीच फ्लश नहीं करते हैं, तब तक वे जो आदेश प्रकट करते हैं वह कम या ज्यादा निर्दिष्ट नहीं होता है; आप जिस पर भरोसा कर सकते हैं वह यह है कि एक << से cerr में cout से वर्ण नहीं होंगे। आपके मामले में, कार्यान्वयन कुछ तरीकों से cout और cerr सिंक्रनाइज़ कर रहा है। (आप देखना चाहते हैं कि क्या होता है यदि आप अपने आउटपुट को विभिन्न फ़ाइलों पर रीडायरेक्ट करते हैं। या उसी गैर-इंटरैक्टिव फ़ाइल — सी ++ इंटरैक्टिव डिवाइस और अन्य के बीच कोई भेद नहीं करता है, लेकिन सी करता है, और मुझे उम्मीद है कि अधिकांश सी ++ कार्यान्वयन सी का पालन करें । इस संबंध)

Fwiw, आदेश के संबंध में दो की गारंटी देता है कर रहे हैं:

  • coutcin से जुड़ा हुआ है, इसलिए किसी भी cin पर पढ़ने के लिए प्रयास cout फ्लश, और
  • cerrunitbuf सेट है, तो यह प्रत्येक << ऑपरेटर के अंत में फ़्लश किया गया।

उत्तरार्द्ध के पीछे विचार यह मैं, लगता है सी लाइन बफरिंग करने के लिए कुछ इसी तरह है, जो सी ++ सीधे — का समर्थन नहीं करता है, हालांकि अगर आप std::endl उपयोग करते हैं, आप लाइन बफरिंग रूप में एक ही प्रभाव प्राप्त प्राप्त करने के लिए है।

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