C ++ में cout, cerr, clog of iostream हैडर में क्या अंतर है? कब कौन सा उपयोग करें?


98

मैं के बीच अंतर पर शोध करने की कोशिश की cout, cerrऔर clogइंटरनेट पर लेकिन एक आदर्श जवाब नहीं मिल सका। मुझे अभी भी स्पष्ट नहीं है कि किसका उपयोग कब करना है। क्या कोई मुझे सरल कार्यक्रमों के माध्यम से समझा सकता है और कब कौन सा उपयोग करना है, इस पर एक सही स्थिति बताएगा?

मैंने इस साइट का दौरा किया, जो एक छोटे से कार्यक्रम को दिखाता है cerrऔर clog, लेकिन वहां पर प्राप्त आउटपुट का उपयोग करके भी प्राप्त किया जा सकता है cout। इसलिए, मैं प्रत्येक के सटीक उपयोग पर उलझन में हूं।


6
प्रत्येक के पास एक कंप्यूटर से मान्यता प्राप्त स्ट्रीम है stdout, stdin(के लिए cin), और stderrयह कि वह डिफ़ॉल्ट रूप से उपयोग करता है। मेरा मानना clogहै कि बस cerrएक बफ़रिंग परिवर्तन के साथ है।
क्रिस

जवाबों:


48

stdoutऔर stderrविभिन्न धाराएँ हैं, भले ही वे दोनों डिफ़ॉल्ट रूप से कंसोल आउटपुट को संदर्भित करते हैं। पुनर्निर्देशन (पाइपिंग) उनमें से एक (जैसे program.exe >out.txt) दूसरे को प्रभावित नहीं करेगा।

आम तौर पर, stdoutवास्तविक कार्यक्रम आउटपुट के लिए उपयोग किया जाना चाहिए, जबकि सभी जानकारी और त्रुटि संदेश को प्रिंट किया जाना चाहिए stderr, ताकि यदि उपयोगकर्ता किसी फ़ाइल पर आउटपुट करता है, तो जानकारी संदेश अभी भी स्क्रीन पर मुद्रित होते हैं और आउटपुट फ़ाइल पर नहीं।


131

आम तौर पर आप std::coutसामान्य आउटपुट के लिए, std::cerrत्रुटियों के लिए, और std::clog"लॉगिंग" के लिए उपयोग करते हैं (जिसका अर्थ है कि आप जो भी चाहें इसका मतलब कर सकते हैं)।

प्रमुख अंतर यह है कि std::cerrअन्य दो की तरह बफर नहीं है।


पुराने C के संबंध में stdoutऔर stderr, से std::coutमेल खाती है stdout, जबकि std::cerrऔर std::clogदोनों से मेल खाती है stderr(सिवाय इसके कि std::clogबफर है)।


मैंने पढ़ा है कि clogयह भी करने के लिए outputs cerr। तो उसके आधार पर, आप किसे चुनते हैं? यदि clogआम तौर पर "लॉगिंग" के लिए है, तो मैं यह क्यों चाहूंगा कि त्रुटि धारा में जाए? लॉग coutत्रुटियों की तुलना में "सामान्य लॉग" (उर्फ ) की तरह अधिक लगते हैं।
void.pointer

@ void.pointer के रूप में मैं अपने जवाब में कहा, दोनों cerrऔर clogमानक "त्रुटि" उत्पादन का उपयोग करता है, लेकिन clogबफ़र है हो सकता है यही वजह है कि इसे और अधिक की तरह लगता है cout। त्रुटि आउटपुट के लिए कौन सा चुनना है? निर्भर करता है कि मैं जितना सूचीबद्ध कर सकता हूं, उससे अधिक कारणों पर और इसे मामले से मामले में तय किया जाना है।
कुछ प्रोग्रामर

3
"बफ़र्ड" से आपका क्या मतलब है?
सरलीकरण

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

15

मानक आउटपुट स्ट्रीम (cout): कक्षा coutका उदाहरण है ostreamcoutमानक आउटपुट डिवाइस पर आउटपुट का उत्पादन करने के लिए उपयोग किया जाता है जो आमतौर पर डिस्प्ले स्क्रीन है। स्क्रीन पर प्रदर्शित किए जाने वाले डेटा coutको इंसर्शन ऑपरेटर ( <<) का उपयोग करके मानक आउटपुट स्ट्रीम ( ) में डाला जाता है ।

अन-बफ़र की मानक त्रुटि स्ट्रीम (cerr): cerr मानक त्रुटि स्ट्रीम है जिसका उपयोग त्रुटियों को आउटपुट करने के लिए किया जाता है। यह भी ostreamवर्ग का एक उदाहरण है । जैसा cerrकि अन-बफर है इसलिए इसका उपयोग तब किया जाता है जब हमें त्रुटि संदेश को तुरंत प्रदर्शित करने की आवश्यकता होती है। इसमें त्रुटि संदेश को संग्रहीत करने और बाद में प्रदर्शित करने के लिए कोई बफर नहीं है।

बफर स्टैण्डर्ड एरर स्ट्रीम (क्लॉग): यह भी ostreamक्लास का एक उदाहरण है और त्रुटियों को प्रदर्शित करने के लिए उपयोग किया जाता है लेकिन cerrत्रुटि के विपरीत इसे पहले बफर में डाला जाता है और बफर में तब तक स्टोर किया जाता है जब तक कि यह पूरी तरह से भर न जाए।

आगे पढ़े: बेसिक-इनपुट-आउटपुट-सी


11

इन 3 धाराओं का अंतर बफरिंग है।

  1. Cerr के साथ, आउटपुट फ्लश करता है
    • तुरंत (क्योंकि सेर बफर का उपयोग नहीं करता है)।
  2. क्लॉग के साथ, आउटपुट फ्लश होता है
    • अपने वर्तमान कार्य को पूरा करने के बाद।
    • स्पष्ट रूप से फ़ंक्शन फ्लश को कॉल करें।
  3. कटआउट के साथ, आउटपुट फ्लश होता है
    • आपके द्वारा किसी भी आउटपुट स्ट्रीम (cout, cerr, clog) को कॉल करने के बाद।
    • अपने वर्तमान कार्य को पूरा करने के बाद।
    • स्पष्ट रूप से फ़ंक्शन फ्लश को कॉल करें।

कृपया निम्नलिखित कोड की जाँच करें, और 3 लाइनों के माध्यम से DEBUG चलाएं: f (std :: clog), f (std :: cerr), f (std :: out), फिर जो हुआ उसे देखने के लिए 3 आउटपुट फाइल खोलें। आप इन 3 लाइनों को स्वैप कर सकते हैं कि क्या होगा।

#include <iostream>
#include <fstream>
#include <string>

void f(std::ostream &os)
{
    std::cin.clear(); // clear EOF flags
    std::cin.seekg(0, std::cin.beg); // seek to begin

    std::string line;
    while(std::getline(std::cin, line))   //input from the file in.txt
        os << line << "\n";   //output to the file out.txt
}

void test()
{
    std::ifstream in("in.txt");
    std::ofstream out("out.txt"), err("err.txt"), log("log.txt");
    std::streambuf *cinbuf = std::cin.rdbuf(), *coutbuf = std::cout.rdbuf(), *cerrbuf = std::cerr.rdbuf(),
                    *clogbuf = std::clog.rdbuf();

    std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
    std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
    std::cerr.rdbuf(err.rdbuf());
    std::clog.rdbuf(log.rdbuf());


    f(std::clog);
    f(std::cerr);
    f(std::cout);

    std::cin.rdbuf(cinbuf);
    std::cout.rdbuf(coutbuf);
    std::cerr.rdbuf(cerrbuf);
    std::clog.rdbuf(clogbuf);
}

int main()
{
    test();
    std::cout << "123";
}

10
  • मानक आउटपुट के लिए cout का उपयोग करें ।
  • त्रुटियों को दिखाने के लिए cerr का उपयोग करें ।
  • लॉगिंग के लिए क्लॉग का उपयोग करें ।

6
गलत, cerr गैर-बफर के कारण cout से धीमा है! जैसे
प्रिंट

4

ड्राफ्ट C ++ 17 मानक दस्तावेज़ से:

30.4.3 नैरो स्ट्रीम ऑब्जेक्ट्स [संकीर्ण.स्ट्रीम .objects]

istream cin;

1 ऑब्जेक्ट (30.11.1) में घोषित cinऑब्जेक्ट से जुड़े स्ट्रीम बफर से इनपुट को नियंत्रित करता है ।stdin<cstdio>

2 वस्तु cinके आरंभिक होने के बाद , cin.tie()रिटर्न &cout। इसकी स्थिति अन्यथा basic_ios<char>::init(30.5.5.2) के लिए आवश्यक है ।

ostream cout;

3 ऑब्जेक्ट (30.11.1) में घोषित coutऑब्जेक्ट से जुड़े स्ट्रीम बफर को आउटपुट नियंत्रित करता है ।stdout<cstdio>

ostream cerr;

4 ऑब्जेक्ट cerrआउटपुट से संबंधित ऑब्जेक्ट के साथ जुड़े स्ट्रीम बफर को नियंत्रित करता है stderr, जिसमें घोषित किया गया है<cstdio> (30.11.1) ।

5 ऑब्जेक्ट cerrको इनिशियलाइज़ करने के बाद , cerr.flags() & unitbufनॉनज़रो और cerr.tie()रिटर्न होता है &cout। इसकी स्थिति अन्यथा basic_ios<char>::init(30.5.5.2) के लिए आवश्यक है ।

ostream clog;

6 ऑब्जेक्ट (30.11.1) में घोषित clogऑब्जेक्ट से जुड़े स्ट्रीम बफर को आउटपुट नियंत्रित करता है ।stderr<cstdio>

चर्चा ...

coutको लिखता है stdout; cerrऔर clogकरने के लिएstderr

मानक आउट ( stdout) का उद्देश्य कार्यक्रम से गैर-त्रुटि, गैर-नैदानिक ​​आउटपुट प्राप्त करना है, जैसे कि सफल प्रसंस्करण से आउटपुट जो अंतिम-उपयोगकर्ता को प्रदर्शित किया जा सकता है या कुछ और प्रसंस्करण चरण में स्ट्रीम किया जा सकता है।

stderrनैदानिक त्रुटि के लिए मानक त्रुटि ( ) का इरादा है, जैसे कि चेतावनी और त्रुटि संदेश जो प्रोग्राम को इंगित करता है कि उपयोगकर्ता ने अपेक्षित आउटपुट का उत्पादन नहीं किया है या नहीं किया है। यह इनपुट अंतिम उपयोगकर्ता को भी दिखाया जा सकता है, भले ही आउटपुट डेटा को आगे की प्रक्रिया के चरण में ले जाया गया हो।

cinऔर cerrबंधे हुए हैंcout

coutI / O संचालन से निपटने से पहले वे दोनों फ्लश करते हैं। यह सुनिश्चित करता है कि भेजे गए संकेत coutप्रोग्राम ब्लॉक से इनपुट को पढ़ने से पहले दिखाई दे रहे हैं cin, और इससे पहले के आउटपुट के coutमाध्यम से एक त्रुटि लिखने से पहले फ्लश किया जाता है cerr, जो संदेशों को अपनी पीढ़ी के कालानुक्रमिक क्रम में रखता है जब दोनों को एक ही टर्मिनल / फ़ाइल / के लिए निर्देशित किया जाता है आदि..

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


1

दोनों अदालत और रोकना बफ़र कर रहे हैं लेकिन cerr अन-बफ़र है और इनमें से सभी वस्तुओं जो वर्ग ostream के उदाहरण हैं पूर्वनिर्धारित कर रहे हैं। इन तीन के मूलभूत उपयोग कर रहे हैं अदालत , जबकि मानक इनपुट के लिए प्रयोग किया जाता है रोकना और cerr त्रुटियों को दिखाने के लिए प्रयोग किया जाता है। मुख्य बिंदु क्यों cerr un-buffered है हो सकता है क्योंकि मान लीजिए कि आपके पास बफर में कई आउटपुट हैं और एक त्रुटि अपवाद कोड में उल्लिखित है, तो आपको उस त्रुटि को तुरंत प्रदर्शित करने की आवश्यकता है जो cerr द्वारा की जा सकती है प्रभावी रूप से ।

अगर मैं गलत हूं कृपया मुझे सही।

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