2013-02-13 20 views
12

क्या कोई परिस्थिति है जब std::cout << "hello" काम नहीं करता है? मेरे पास एक सी/सी ++ कोड है, हालांकि std::cout कुछ भी प्रिंट नहीं करता है, यहां तक ​​कि स्थिर तारों (जैसे "हैलो") भी नहीं।std :: cout प्रिंट नहीं करेगा

क्या यह जांचने का कोई तरीका है कि cout स्ट्रीम खोलने में सक्षम/अक्षम है? good(), bad() जैसे कुछ सदस्य फ़ंक्शन हैं ... लेकिन मुझे नहीं पता कि मेरे लिए कौन सा उपयुक्त है।

+7

आह, buffered-output, हालांकि कला एक दिलहीन और क्रूर wench। – WhozCraig

+3

सी –

+0

में कोई 'std :: cout' नहीं है एक विंडोिंग सिस्टम में, 'std :: cout' लागू नहीं किया जा सकता है क्योंकि खिड़कियां हैं और ओएस नहीं जानता कि आपकी कौन सी विंडो आउटपुट करने के लिए है। –

उत्तर

29

सुनिश्चित करें कि आप स्ट्रीम को फ्लश करें। यह आवश्यक है क्योंकि आउटपुट स्ट्रीम buffered हैं और जब तक आप इसे मैन्युअल रूप से फ्लश नहीं करते हैं तब तक बफर को फ़्लश किया जाएगा जब आपके पास कोई गारंटी नहीं है।

std::cout << "Hello" << std::endl; 

std::endl इच्छा उत्पादन एक नई पंक्ति और धारा फ्लश। वैकल्पिक रूप से, std::flushबस फ्लश करेगा।

std::cout.flush(); 
+1

+1 या तो 'std :: cout << "हैलो \ n" ' –

+0

कोई अंतर नहीं :( – mahmood

+3

@GrijeshChauhan जब से स्वरूपित आउटपुट स्ट्रीम में केवल एक न्यूलाइन चार भेजता है तो फ्लश को मजबूर करता है? मैंने सोचा कि मानक नहीं था फ़्लश के बारे में सामग्री-जागरूक, स्ट्रीम बफर फ्लश की यात्रा के लिए सदस्यों ('फ्लश()') और मैनिपुलेटर्स ('एंडल') पर भरोसा करते हैं? क्या यह एक विशिष्ट सी ++ मानक के बाद ऐसा है? – WhozCraig

5

यह संभव है कि std::cout बफरिंग की वजह से काम नहीं करता है (क्या आप लिख रहे हैं std::cout के बफर में के बजाय उत्पादन में समाप्त होता है): फ्लशिंग भी स्ट्रीम का सदस्य समारोह का उपयोग किया जा सकता है।

आप इन चीजों में से एक कर सकते हैं:

  • फ्लश std::cout स्पष्ट:

    std::cout << "test" << std::flush; // std::flush is in <iostream> 
    

    std::cout << "test"; 
    std::cout.flush(); // explicitly flush here 
    

    std::cout << "test" << std::endl; // endl sends newline char(s) and then flushes 
    
  • इसके बजाय std::cerr का उपयोग करें। std::cerr buffered नहीं है, लेकिन यह एक अलग स्ट्रीम का उपयोग करता है (यानी यदि दूसरा समाधान "कंसोल पर संदेश देखें" से अधिक में रुचि रखते हैं तो दूसरा समाधान आपके लिए काम नहीं कर सकता है)।

+0

उनमें से कोई भी मेरे कोड में काम नहीं किया। –

1

प्रभावी रूप से बफरिंग आप इस कॉल कर सकते हैं अक्षम करने के लिए:

std::setvbuf(stdout, NULL, _IONBF, 0); 

फिर, आप अपने कार्यक्रम फोन और अक्षम कमांड लाइन में उत्पादन बफरिंग कर सकते हैं:

stdbuf -o 0 ./yourprogram --yourargs 

मन इस रखें आम तौर पर प्रदर्शन कारणों से नहीं किया जाता है।

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