बफर को फ्लश करने का क्या मतलब है?


95

मैं C ++ सीख रहा हूं और मुझे कुछ ऐसा मिला है जिसे मैं समझ नहीं सकता:

बफर को लिखे जाने के लिए मजबूर करने के लिए आउटपुट बफ़र्स को स्पष्ट रूप से फ्लश किया जा सकता है। डिफ़ॉल्ट रूप से, cinफ्लश पढ़ना cout; coutजब प्रोग्राम सामान्य रूप से समाप्त होता है, तब भी फ्लश किया जाता है।

इसलिए बफर को फ्लश करना (उदाहरण के लिए आउटपुट बफर): क्या यह बफर को इसमें सबकुछ हटाकर साफ करता है या क्या इसमें सब कुछ आउटपुट करके बफर को साफ करता है? या क्या बफर को फ्लशिंग करने का मतलब पूरी तरह से अलग है?

जवाबों:


122

किसी फ़ाइल पर लिखने पर विचार करें। यह एक महंगा ऑपरेशन है। यदि आपके कोड में आप एक बार में एक बाइट लिखते हैं, तो एक बाइट का प्रत्येक लिखना बहुत महंगा होने वाला है। इसलिए प्रदर्शन को बेहतर बनाने का एक सामान्य तरीका यह है कि आप एक अस्थायी बफर में जो डेटा लिख ​​रहे हैं उसे स्टोर करें। बहुत सारा डेटा होने पर ही फाइल में बफर लिखा जाता है। राइट्स को स्थगित करके, और एक बार में एक बड़े ब्लॉक को लिखने से, प्रदर्शन में सुधार होता है।

इसे ध्यान में रखते हुए, बफर को फ्लश करना डेटा को बफर से फ़ाइल में स्थानांतरित करने का कार्य है।

क्या यह सब कुछ हटाने के द्वारा बफर को साफ करता है या क्या इसमें सब कुछ आउटपुट करके बफर को साफ करता है?

बाद वाला।


1
धन्यवाद। एक और चीज़। सिन पढ़ना फ्लश कॉट। क्या यह "रीडिंग सिन" का अर्थ है जब उपयोगकर्ता कुछ इनपुट करता है या जब उपयोगकर्ता को कुछ दर्ज करने के लिए प्रेरित किया जाता है?
मोहम्मद अहमद नबील

4
सिनेमा पढ़ना तब होता है जब आप धारा ऑपरेटर का उपयोग सिनेमा से पढ़ने के लिए करते हैं। आमतौर पर जब आप पढ़ते हैं तो आप कॉउट को फ्लश करना चाहते हैं क्योंकि अन्यथा प्रॉम्प्ट से पहले इनपुट दिखाई दे सकता है।
डेविड हेफर्नन

1
@DavidHeffernan जहाँ तक मुझे पता है, आपको कभी भी सिने से पहले फ्लश करने की ज़रूरत नहीं है, क्योंकि सिनेमा और कॉउट बंधे हुए हैं (Stroustrup, The C ++ प्रोग्रामिंग लैंग्वेज, [io.tie])।
स्ट्रमर

24

आपने उत्तर उद्धृत किया है:

बफर को लिखे जाने के लिए आउटपुट बफ़र्स को स्पष्ट रूप से फ्लश किया जा सकता है।

यही है, आपको आउटपुट को "फ्लश" करने की आवश्यकता हो सकती है, जिससे इसे अंतर्निहित स्ट्रीम में लिखा जा सकता है (जो कि एक फ़ाइल हो सकती है, या सूचीबद्ध टर्मिनल में)।

आम तौर पर, stdout / cout लाइन-बफ़र्ड होता है: जब तक आप एक नई लाइन नहीं लिखते या बफर को फ्लश नहीं करते हैं, तब तक आउटपुट ओएस को नहीं भेजा जाता है। फायदा यह है कि ऐसा कुछ std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endlहोता है, जो छह के बजाय केवल एक "अंतर्निहित" फ़ाइल को लिखता है, जो प्रदर्शन के लिए बहुत बेहतर है। नुकसान यह है कि एक कोड की तरह:

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

.....एक बार में उत्पादन होगा (सटीक sleepकार्यान्वयन के लिए, यह प्रश्न देखें )। ऐसे मामलों में, आप यह << std::flushसुनिश्चित करने के लिए एक अतिरिक्त चाहेंगे कि आउटपुट प्रदर्शित हो।

cinफ्लश पढ़ना coutइसलिए आपको ऐसा करने के लिए एक स्पष्ट फ्लश की आवश्यकता नहीं है:

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

इसके लिए ऐसा करना (int i = 0; i <5; i ++) {std :: cout << "।"; नींद (1); } std :: cout << std :: endl; एक बार प्रिंट नहीं .....। यह बीच में उन्हें 1 मिलीसेकंड से प्रिंट करता है। जब आप नींद (1000)
मोहम्मद अहमद नबील

@MohamedAhmedNabil आपको (Windows)sleep()Sleep()
tc के

1
पुराना उत्तर, लेकिन केवल टिप्पणी सामग्री के बारे में कम है और उदाहरण के बारे में अधिक है। आप coutएक नाम स्थान (यानी std::cout) के साथ अर्हता प्राप्त करते हैं, लेकिन इसके लिए ऐसा नहीं करते हैं endl, जिसके लिए उस योग्यता की भी आवश्यकता होती है।
Vol7ron

1
मुझे आपका उदाहरण पसंद है। लेकिन मुझे लगा कि एंडल बफर को फ्लश करता है, लेकिन आपके उदाहरण में, \ n बफर को फ्लश करता है। मैं उलझन में हूं।
नाज

1
@Naz \ n बफर को फ्लश नहीं करता है; बफर को केवल उसके उदाहरण में प्रोग्राम के अंत में फ्लश किया जाता है (बफर हमेशा सी ++ के अंत में स्वचालित रूप से फ्लश किया जाता है)। \ n की संभावना केवल स्वरूपण के लिए उपयोग की गई थी। इसके अलावा, आप सही हैं कि std :: endl बफर को फ्लश करता है (तो std :: flush, लेकिन यह आत्म-व्याख्यात्मक है)।
११

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.