2010-07-08 10 views
25

उनके बीच क्या अंतर है और उनका उपयोग कैसे किया जाता है? क्या कोई मुझे उदाहरणों के लिए इंगित कर सकता है?"सीर" और "stderr" क्या हैं?

विशेष रूप से, आप दोनों मामलों में स्ट्रीम में "लिखने" कैसे करते हैं और आप कैसे पाठ को पुनर्प्राप्त और आउटपुट (यानी स्क्रीन पर) लिखते हैं?

इसके अलावा, "स्क्रीन" आउटपुट स्वयं एक स्ट्रीम सही है? शायद मैं अच्छी तरह से धाराओं को समझ में नहीं आता। यह निश्चित रूप से एक फाइल में सहेजा जा सकता है, मुझे पता है। क्या ये सभी fprintf/fscanf आदि का उपयोग करेंगे?

+8

नौसिखिया प्रश्न पूछने के लिए माफ़ी मांगने की आवश्यकता नहीं है। SO _all_ कौशल स्तर के लिए है। – paxdiablo

उत्तर

32

cerr सी ++ स्ट्रीम और stderr सी फ़ाइल हैंडल है, दोनों मानक त्रुटि आउटपुट का प्रतिनिधित्व करते हैं।

आप उन्हें करने के लिए एक ही तरीका है कि आप अन्य नदियों और फ़ाइल पर लिखने लिखने संभालता है:

cerr << "Urk!\n"; 
fprintf (stderr, "Urk!\n"); 

मुझे यकीन है कि आप "की वसूली" इस संदर्भ में से क्या मतलब है नहीं कर रहा हूँ, उत्पादन मानक त्रुटि के लिए चला जाता है और बस। कार्यक्रम के बाद इसके बारे में परवाह करने के लिए नहीं है। यदि आपका मतलब है कि प्रोग्राम के बाहर से बाद में इसे कैसे सहेजना है, तो अगला पैराग्राफ देखें।

डिफ़ॉल्ट रूप से, वे अपने टर्मिनल के लिए जाना होगा, लेकिन उत्पादन की तरह कुछ के साथ कहीं और पुनः निर्देशित किया जा सकता है:

run_my_prog 2>error.out 

और, हाँ, "स्क्रीन" उत्पादन होता है एक धारा (या फ़ाइल हैंडल), लेकिन यह आमतौर पर केवल इसलिए है क्योंकि stdout/cout और stderr/cerr डिफ़ॉल्ट रूप से आपकी "स्क्रीन" से जुड़े हुए हैं। (/dev/tty के होते हुए भी करने के लिए सीधे लिखने जैसा मुश्किल चीजों)

run_my_prog >/dev/null 2>&1 

: रीडायरेक्शन निम्नलिखित मामले में जहां कुछ भी नहीं अपनी स्क्रीन करने के लिए लिखा जाएगा में के रूप में इस को प्रभावित करेगा। वह स्निपेट बिट बाल्टी पर जाने के लिए मानक आउटपुट और मानक त्रुटि दोनों को रीडायरेक्ट करेगा।

+2

दूसरा अंतर यह है कि मानक त्रुटि या तो किसी भी इंटरैक्टिव डिवाइस को संदर्भित करता है या नहीं, भले ही मानक त्रुटि या तो प्रत्येक लिखने पर ऑटो-फ्लश नहीं किया जाता है (यानी प्रत्येक '\ n' पर ऑटो-फ्लश)। इसके विपरीत, मानक आउटपुट पूरी तरह से बफर किया गया है (और केवल अगर) यह एक इंटरेक्टिव डिवाइस का संदर्भ नहीं देता है। –

+2

खैर, तकनीकी रूप से यह stdout और stderr (या cout और cerr) के बीच एक अंतर है, सीर और stderr नहीं :-) – paxdiablo

6

क्या उन्हें

stderr के बीच अंतर है मानक सी पुस्तकालय का हिस्सा एक FILE* है, और। cerr एक ostream है, और मानक C++ लाइब्रेरी का हिस्सा है।

इसके अलावा, "स्क्रीन" आउटपुट स्वयं स्ट्रीम सही है?

हाँ, यह है। लेकिन वास्तव में दो स्ट्रीम जो डिफ़ॉल्ट रूप से स्क्रीन पर लिखते हैं: stdout/cout सामान्य आउटपुट के लिए है और stderr/cerr त्रुटि संदेशों के लिए है। यह पुनर्निर्देशन के लिए उपयोगी है: आप फ़ाइल में stdout को रीडायरेक्ट कर सकते हैं लेकिन फिर भी स्क्रीन पर आपके त्रुटि संदेश हैं।

+0

क्या 'std :: ostream cerr' ऑब्जेक्ट से' FILE * stderr' सूचक प्राप्त करना संभव है? ('cerr.rdbuf() -> bla' जैसे कुछ) – alfC

+0

@alfC: ऐसा करने का कोई मानक तरीका नहीं है। Http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream देखें। – dan04

+0

हां, मैंने वहां उत्तर दिया http://stackoverflow.com/a/19749019/225186। मुझे लगता है कि सबसे सुंदर जवाब यह है: http://stackoverflow.com/a/33612982/225186 – alfC

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