2017-12-18 52 views
5

cout एक बफर स्ट्रीम है। इसका मतलब है कि डेटा बफर को लिखा जाएगा और स्ट्रीम फ़्लश होने पर मुद्रित किया जाएगा, प्रोग्राम समाप्त हो जाएगा या जब बफर पूरी तरह से भर जाएगा।तुरंत आउटपुट क्यों आउटपुट है?

मैंने यह जांचने के लिए एक छोटा सा कार्यक्रम बनाया कि यह कैसे काम करता है, लेकिन मुझे समझ में नहीं आता कि उपर्युक्त शर्तों में से किसी एक से पहले यह प्रिंट क्यों करता है।

#include <iostream> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    cout << "Test"; 
    float secs = 5; 
    clock_t delay = secs * CLOCKS_PER_SEC; 
    clock_t start = clock(); 
    while (clock() - start < delay) { } 
    return 0; 
} 

रन करते समय, "परीक्षण" लूप शुरू होने से पहले आउटपुट होता है।

प्रोग्राम आउट होने तक मेरा आउटपुट क्यों बफर नहीं किया जाता है?

+2

'std :: ios :: sync_with_stdio (false) का प्रयास करें;' प्रिंट करने से पहले। – scohe001

+1

std :: ios :: sync_with_stdio (झूठा); महान काम करता है, धन्यवाद! पर क्यों? –

+0

नीचे मेरा जवाब देखें – scohe001

उत्तर

4

here पर इस पर एक अच्छी चर्चा है।

हर सी ++ धारा एक संबद्ध धारा बफर ऑब्जेक्ट का उपयोग करता बफरिंग प्रदर्शन करने के लिए:

जवाब में से एक से

जब std::cout का निर्माण किया गया है, तो यह में घोषित ऑब्जेक्ट stdout से जुड़े स्ट्रीम बफर का उपयोग करता है। डिफ़ॉल्ट रूप से, std::cout पर संचालन आउटपुट फ़ंक्शंस जैसे std::printf() के साथ स्वतंत्र रूप से मिश्रित किया जा सकता है।

व्यावहारिक रूप से, सिंक्रनाइज़ेशन आमतौर पर इसका मतलब है कि मानक iostream ऑब्जेक्ट और मानक stdio ऑब्जेक्ट एक बफर साझा करता है। -

यदि std::ios_base::sync_with_stdio(false) को मानक धाराओं पर किसी भी इनपुट या आउटपुट ऑपरेशंस से पहले कहा जाता है), मानक सी ++ धाराएं मानक सी धाराओं (यानी वे अपने स्वयं के अलग स्ट्रीम बफर पर स्विच) से स्वतंत्र रूप से संचालित होती हैं।

अधिक के लिए, cppreference पर sync_with_stdio फ़ंक्शन संदर्भ पृष्ठ देखें।

उस पृष्ठ, समारोह से ...

सेट करती है कि मानक सी ++ धाराओं मानक सेल्सियस के लिए सिंक्रनाइज़ किए जाते हैं प्रत्येक इनपुट/आउटपुट ऑपरेशन के बाद धाराओं।

... प्रैक्टिस में, इसका मतलब है कि सिंक्रनाइज़ सी ++ धाराएं अनबफर की जाती हैं, और सी ++ स्ट्रीम पर प्रत्येक I/O ऑपरेशन तत्काल सी स्ट्रीम के बफर पर लागू होता है। इससे सी ++ और सी I/O को स्वतंत्र रूप से मिश्रण करना संभव हो जाता है।

हालांकि, इस कार्यप्रणाली को कॉल करने के बाद पहले से ही किया गया है पढ़ता है या लिखते हैं सावधान रहना:

यदि यह समारोह के बाद मैं/हे मानक धारा पर आ गई है कहा जाता है, व्यवहार कार्यान्वयन परिभाषित किया गया है : कार्यान्वयन रीड बफर को नष्ट करने के लिए किसी भी प्रभाव से नहीं है।

2

एक और महान बातचीत here भी है। यह कुछ चीजों से संबंधित लगता है जो 2001 का उल्लेख किया गया है, हालांकि थोड़ा अलग है, इसलिए मैं इसे अपने स्वयं के उत्तर में रखूंगा।

उपरोक्त उत्तर से संबंधित this उस मंच पर पोस्ट है, जो इस बात के बारे में बात करता है कि बफर को अन्य आसपास के कोड के आधार पर कैसे फ़्लश किया जाता है। Std :: cout फ़ंक्शन अन्य स्ट्रीम फ़ंक्शंस, और सामान्य सी लाइब्रेरी फ़ंक्शंस के साथ जुड़ा हुआ है, जिसका उल्लेख स्कही 2001 है। तो अगर कुछ कहा जाता है कि यह बंधे हुए हैं, तो इसके बफर जारी रखने से पहले फ्लश करेंगे।

क्या आप इसे लिनक्स पर जीसीसी के साथ संकलित कर रहे हैं, या इसे कुछ विंडोज वातावरण में चला रहे हैं? ओएस विशिष्ट कार्यों के बारे में वार्तालाप के ऊपर उस मंच से here पोस्ट करता है, और यह कि खिड़कियों से नींद() बफर को बाहर निकलने का कारण बन सकती है। अन्यथा सामान्य जीसीसी संकलित सी ++ कोड नींद() का उपयोग करके बफर को मुद्रित नहीं करेगा, जब तक कि इसे जारी रखने से पहले बफर को फ्लश करने वाले किसी भी अन्य कोड का सामना नहीं किया गया हो।

इन उपरोक्त पदों में बहुत सारी जानकारी शामिल है, इसलिए मैं इसे कॉपी और पेस्ट करने से बचना चाहूंगा, इसलिए कृपया मुझे स्टैक ओवरफ्लो देवताओं को क्षमा करें।

मुझे आशा है कि यह जानकारी मददगार होगी!

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