সিউটি, সিআরআর, আইওস্ট্রিম হেডারের ক্লগের মধ্যে পার্থক্য কী? কোনটি ব্যবহার করবেন?


104

আমি এর মধ্যে পার্থক্য নিয়ে গবেষণা চেষ্টা cout, cerrএবং clogইন্টারনেটে কিন্তু একটি নিখুঁত উত্তর খুঁজে পাইনি। কখন ব্যবহার করব তা নিয়ে এখনও আমি পরিষ্কার নই। কেউ কি সহজ প্রোগ্রামের মাধ্যমে আমাকে ব্যাখ্যা করতে পারে এবং কোনটি কখন ব্যবহার করতে হবে তার একটি নিখুঁত পরিস্থিতি চিত্রিত করতে পারে?

আমি এই সাইটটি পরিদর্শন করেছি যা এতে cerrএবং একটি ছোট প্রোগ্রাম দেখায় clogতবে সেখানে প্রাপ্ত আউটপুটটিও ব্যবহার করে পাওয়া যেতে পারে cout। সুতরাং, আমি প্রত্যেকের সঠিক ব্যবহার সম্পর্কে বিভ্রান্ত হয়ে পড়েছি।


6
প্রত্যেকের একটি কম্পিউটার-স্বীকৃত স্ট্রিম রয়েছে stdout, stdin( cin) জন্য এবং stderrএটি ডিফল্টরূপে ব্যবহার করে। আমি বিশ্বাস করি clogকেবল cerrএকটি বাফারিং পরিবর্তন নিয়ে।
ক্রিস

উত্তর:


52

stdoutএবং stderrউভয়ই ডিফল্টরূপে কনসোল আউটপুটকে উল্লেখ করে যদিও বিভিন্ন স্ট্রিম। তাদের মধ্যে একটিকে পুনর্নির্দেশ করা (পাইপিং করা) (উদাহরণস্বরূপ program.exe >out.txt) অন্যটির উপর প্রভাব ফেলবে না।

সাধারণত, stdoutপ্রকৃত প্রোগ্রাম আউটপুট জন্য ব্যবহার করা উচিত, যখন সমস্ত তথ্য এবং ত্রুটি বার্তা প্রিন্ট করা উচিত stderr, যাতে ব্যবহারকারী যদি কোনও ফাইলের আউটপুট পুনর্নির্দেশ করে, তথ্যের বার্তাগুলি এখনও পর্দায় মুদ্রিত থাকে এবং আউটপুট ফাইলটিতে নয়।


132

সাধারণত আপনি std::coutসাধারণ আউটপুট, std::cerrত্রুটি এবং std::clog"লগিং" এর জন্য ব্যবহার করেন (যার অর্থ আপনি যা বোঝাতে চান তা বোঝাতে পারে)।

প্রধান পার্থক্যটি হ'ল std::cerrঅন্য দুটির মতো বাফার হয়নি।


পুরাতন সি সম্পর্ক stdoutএবং stderr, std::coutসাথে সঙ্গতিপূর্ণ stdoutসময়, std::cerrএবং std::clogউভয় অনুরূপ stderr(ছাড়া std::clogবাফার হয় না)।


আমি এটি পড়ে clogআউটপুট পড়েছি cerr। সুতরাং এর উপর ভিত্তি করে, আপনি কোনটি বেছে নিন? যদি clogসাধারণত "লগিং" করার জন্য হয় তবে আমি কেন এটি ত্রুটি প্রবাহে যেতে চাই? লগগুলি coutত্রুটির চেয়ে "নরমাল লগস" (ওরফে ) এর মতো মনে হয় ।
void.pointer

@ void.pointer আমি আমার উত্তরে যেমন বলেছি, উভয়ই cerrএবং clog"স্ট্যান্ডার্ড" ত্রুটি "আউটপুট ব্যবহার করে তবে clogএটি বাফার্ড হয় যার কারণ এটি আরও বেশি পছন্দ বলে মনে হয় cout। ত্রুটি আউটপুট জন্য কোনটি বেছে নেবে? আমি তালিকাবদ্ধ করতে পারি তার চেয়ে বেশি কারণে আমার অনুমান নির্ভর করে এবং এটি কেস থেকে কেস কেসে সিদ্ধান্ত নিতে হবে।
কিছু প্রোগ্রামার

4
"বাফারড" বলতে কী বোঝ?
সরলনাম

6
@ সিম্প্লেনাম আউটপুট সরাসরি লেখা হয় না, বাফারটি ফ্লাশ না হওয়া পর্যন্ত এটি একটি বাফারে সংরক্ষণ করা হয় । কোনও ফাইল বা টার্মিনালের আউটপুট historতিহাসিকভাবে ধীর (টার্মিনাল বা কনসোলগুলি এখনও ধীর), অক্ষর অনুসারে অক্ষর লেখা কার্যকর হয় না, বাইটের একটি অংশ লেখা আরও কার্যকর।
কিছু প্রোগ্রামার

16

স্ট্যান্ডার্ড আউটপুট স্ট্রিম (cout): cout এটি ostreamশ্রেণীর উদাহরণ । coutস্ট্যান্ডার্ড আউটপুট ডিভাইসে আউটপুট উত্পাদন করতে ব্যবহৃত হয় যা সাধারণত ডিসপ্লে স্ক্রিন হয়। স্ক্রিনে প্রদর্শিত হওয়ার জন্য প্রয়োজনীয় তথ্য coutসন্নিবেশ অপারেটর ( <<) ব্যবহার করে স্ট্যান্ডার্ড আউটপুট স্ট্রিম ( ) sertedোকানো হয় ।

আন-বাফার স্ট্যান্ডার্ড ত্রুটি স্ট্রিম (সারার): cerr এটি স্ট্যান্ডার্ড ত্রুটি স্ট্রিম যা ত্রুটিগুলি আউটপুট দেওয়ার জন্য ব্যবহৃত হয়। এটি ostreamক্লাসের উদাহরণও । হিসাবে cerrহয় বাফার উন তাই এটি ব্যবহার করা হয় যখন আমরা অবিলম্বে ত্রুটি বার্তা প্রদর্শন করতে হবে। ত্রুটি বার্তাটি সংরক্ষণ এবং পরে প্রদর্শন করার জন্য এটিতে কোনও বাফার নেই।

বাফার স্ট্যান্ডার্ড ত্রুটি স্ট্রিম (ক্লোগ): এটি ostreamশ্রেণীর একটি উদাহরণ এবং ত্রুটিগুলি প্রদর্শন করতে ব্যবহৃত হয় তবে cerrত্রুটিটির বিপরীতে প্রথমে একটি বাফারে isোকানো হয় এবং এটি পুরোপুরি পূরণ না হওয়া অবধি বাফারে সংরক্ষণ করা হয়।

আরও পড়া: বেসিক ইনপুট-আউটপুট-সি


until it is not fully filled.- এই কি বলবে না until it IS fully filled?
গ্যাব্রিয়েল স্ট্যাপলস

11

এই 3 টি স্ট্রিমের পার্থক্য বাফার করছে।

  1. সেরারের সাথে সাথে আউটপুট ফ্লাশ হয়
    • অবিলম্বে (কারণ সেরার বাফার ব্যবহার করে না)।
  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 মান আউটপুট।
  • ত্রুটিগুলি দেখানোর জন্য সেরার ব্যবহার করুন ।
  • লগিংয়ের জন্য ক্লগ ব্যবহার করুন ।

6
ভুল, সেরার-বাফার না করার কারণে কাউটের তুলনায় ধীর গতির! যেমন বনাম প্রিন্টফ লিখুন

4

একটি খসড়া সি ++ 17 স্ট্যান্ডার্ড ডকুমেন্ট থেকে:

30.4.3 সঙ্কীর্ণ স্ট্রিম অবজেক্টস [সরু.প্রবাহ.অবজেক্টস]

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 (30.11.1) এ ঘোষিত cerrবস্তুর সাথে সম্পর্কিত স্ট্রিম বাফারে আউটপুট নিয়ন্ত্রণ করে ।stderr<cstdio>

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) এর উদ্দেশ্য হ'ল প্রোগ্রামটি থেকে অ-ত্রুটিহীন, ডায়াগনস্টিক আউটপুট যেমন সফল প্রসেসিংয়ের আউটপুট যা শেষ ব্যবহারকারীর কাছে প্রদর্শিত হতে পারে বা আরও কিছু প্রক্রিয়াজাত পর্যায়ে প্রবাহিত হতে পারে to

স্ট্যান্ডার্ড ত্রুটি stderrডায়াগনস্টিক আউটপুট, যেমন সতর্কতা এবং ত্রুটি বার্তাগুলি দ্বারা নির্দেশিত হয় যা প্রোগ্রামটি আউটপুট ব্যবহারকারী হিসাবে প্রত্যাশা করতে পারে নি বা তৈরি করতে পারে না তা নির্দেশ করে। এই ইনপুটটি শেষ ব্যবহারকারীর কাছে প্রদর্শিত হতে পারে এমনকি যদি আউটপুট ডেটাটি আরও প্রক্রিয়াকরণ পর্যায়ে পাইপ করা হয়।

cinএবং cerrবাঁধা হয়cout

তারা উভয়ই coutI / O অপারেশনগুলি নিজে পরিচালনা করার আগে ফ্লাশ করে। এটি নিশ্চিত করে যে প্রেরিত প্রম্পটগুলি coutপ্রোগ্রামের ব্লকগুলি থেকে ইনপুটটি পড়ার আগে দৃশ্যমান হয় এবং এর আগে কোনও cinআউটপুট coutত্রুটি লেখার আগে ফ্লাশ করা হয় cerr, যা বার্তাগুলি তাদের প্রজন্মের কালানুক্রমিক ক্রমে রাখে যখন উভয়ই একই টার্মিনাল / ফাইল / নির্দেশিত হয় ইত্যাদি ..

এটি এর সাথে বিপরীত হয় clog- আপনি যদি সেখানে লিখেন তবে এটি বাফার হবে না এবং কোনও কিছুর সাথে আবদ্ধ হবে না, সুতরাং এটি ফ্লাশ করার আগে শালীন আকারের লগিংয়ের বাফার করবে। এটি বার্তাগুলির সর্বোচ্চ থ্রুটপুট দেয়, তবে এর অর্থ বার্তাগুলি টার্মিনালটি পড়তে বা লগটি শিথিল করে কোনও গ্রাহককে দ্রুত দৃশ্যমান নাও হতে পারে।


1

উভয় cout এবং খড়ম বাফার হয় কিন্তু cerr নিঃ- বাফার এবং এই সব বস্তু যা বর্গ ostream উদাহরণ স্বরূপ ধরে পূর্বনির্ধারিত করছে। এই তিনটি মৌলিক ব্যবহার হয় cout যেহেতু স্ট্যান্ডার্ড ইনপুট জন্য ব্যবহার করা হয় খড়ম এবং cerr ত্রুটি দেখানো জন্য ব্যবহৃত হয়। সেররকে কেন বাফার করা হচ্ছে না তার মূল বিষয়টি হ'ল কারণ ধরুন আপনার বাফারে বেশ কয়েকটি আউটপুট রয়েছে এবং কোডটিতে একটি ত্রুটি ব্যতিক্রম উল্লেখ করা হয়েছে তবে আপনাকে ত্রুটিটি তাত্ক্ষণিকভাবে প্রদর্শন করা দরকার যা সেরার দ্বারা কার্যকরভাবে করা যায়।

আমি ভুল হলে আমাকে সংশোধন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.