2012-12-27 15 views
12

डिफ़ॉल्ट रूप से, मानक इनपुट डिवाइस फ़ॉर्म में मानक आउटपुट डिवाइस के साथ एक साथ बंधे हैं: std::cin.tie (&std::cout); जो गारंटी देता है कि इनपुट बफर को इनपुट लागू होने से पहले फ़्लश कर दिया गया है। तो मैं std::cin.tie(0) का उपयोग कर उन्हें खोलने की कोशिश करता हूं, लेकिन ऐसा लगता है कि परिणाम, बंधे हुए के साथ कोई फर्क नहीं पड़ता।हमें std :: cin और std :: cout को बांधने की आवश्यकता क्यों है?

#include<iostream> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    char c; 

    cin.tie(0) 

    cout << "Please enter c:"; 
    cin >> c; 
    cout << c ; 

    return 0; 
} 

क्या मैं गलत परीक्षण कर रहा हूं? हमें उन्हें एक साथ बांधने की ज़रूरत क्यों है? क्या वे वही बफर साझा करते हैं?

+0

टाई के पीछे विचार यह है कि इनपुट पढ़ने से पहले संकेत प्रदर्शित किया जाना चाहिए। :-) –

उत्तर

16

आपके उदाहरण में कुछ भी गलत नहीं है (सिवाय इसके कि आपको cin.tie(0) लाइन के बाद अर्ध-कॉलन जोड़ना चाहिए), न ही iostream ऑब्जेक्ट्स के काम के साथ।

tie() एक इनपुट निष्पादित करने से पहले cout की फ्लशिंग की गारंटी देता है। जवाब के लिए पूछे जाने से पहले उपयोगकर्ता को प्रश्न देखने के लिए यह उपयोगी है।

हालांकि, अगर आप cout से tie()cin संयुक्त राष्ट्र, वहाँ कोई गारंटी नहीं है कि cout के बफर प्लावित किया जाता है। लेकिन इस बात की कोई गारंटी नहीं है कि बफर न तो फंस गया है। वास्तव में, यदि कंप्यूटर के पास पर्याप्त संसाधन हैं, तो यह cout बफर तुरंत फ़्लश करेगा, इसलिए यह cin इनपुट के लिए पूछने से पहले होता है। यह आपके उदाहरण में मामला है।

तो, सबकुछ अच्छी तरह से काम करता है। सिवाय इसके कि cin.tie(0) के बाद, इस बात की कोई गारंटी नहीं है कि फ्लश-आईएनजी होगी। हालांकि, 99% मामलों में, फ्लश-आईएनजी अभी भी घटित होगी (लेकिन अब इसकी गारंटी नहीं है)।

सिद्धांत में, यदि बंधे हैं, cin और cout समान बफर साझा कर सकता है। लेकिन, मुझे लगता है कि कोई कार्यान्वयन ऐसा नहीं करता है। एक कारण यह है कि दोनों अन-टाई() डी हो सकते हैं।

0

मुझे लगता है कि, पिछला जवाब गलत है (और मुझे आश्चर्य है कि यह इतना ऊंचा क्यों है और स्पष्ट रूप से चिह्नित नहीं है, स्पष्ट रूप से नहीं)।

को तोड़ने के लिए होता है-पहले टाई, आप होगा (मानक कब के मामले में केवल) (1) सिंक stdio और (2) खोल धाराओं के साथ हटा दें।

इस तरह

:

std::cin.tie (nullptr); 
std::cout.sync_with_stdio(false); 
std::cout << "Please enter c: "; 
std::cin >> c; 

तो फिर तुम गारंटी खुल गई स्ट्रीम करने के लिए कर रहे हैं। सी-स्टाइल और सी ++ - शैली इनपुट और आउटपुट के लिए ऑर्डर करने के बाद एसडीडीओ के साथ समन्वय करना उचित क्षमता है - मैं आपको वास्तविक आवश्यकता के बिना इसे हटाने से दृढ़ता से हतोत्साहित करता हूं।

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