我尝试在互联网上研究cout
,cerr
和clog
之间的区别,但找不到完美的答案。我还不清楚何时使用哪个。任何人都可以通过简单的程序向我解释并说明何时使用哪一个的完美情况?
我访问了this site,其中cerr
和clog
上显示了一个小程序,但在那里获得的输出也可以使用cout
获得。所以,我对每个人的确切用途感到困惑。
答案 0 :(得分:106)
通常,您使用std::cout
表示正常输出,std::cerr
表示错误,std::clog
表示“记录”(这可能意味着您想要的任何意思)。
主要区别在于std::cerr
没有像其他两个那样缓冲。
对于旧的C stdout
和stderr
,std::cout
对应stdout
,而std::cerr
和std::clog
都对应{ {1}}(缓存stderr
除外)。
答案 1 :(得分:41)
stdout
和stderr
是不同的流,即使它们都默认引用控制台输出。重定向(管道)其中一个(例如program.exe >out.txt
)不会影响另一个。
通常,stdout
应该用于实际的程序输出,而所有信息和错误消息都应打印到stderr
,这样如果用户将输出重定向到文件,仍会打印信息消息在屏幕上,而不是输出文件。
答案 2 :(得分:8)
答案 3 :(得分:8)
标准输出流(cout):
cout
是ostream
类的实例。 cout
用于在标准输出设备上产生输出,标准输出设备通常是显示屏。需要在屏幕上显示的数据使用插入运算符(cout
)插入标准输出流(<<
)。
未缓冲的标准错误流(cerr): cerr
是用于输出错误的标准错误流。这也是ostream
类的一个实例。由于cerr
未缓冲所以当我们需要立即显示错误消息时会使用它。它没有任何缓冲区来存储错误消息并稍后显示。
缓冲标准错误流(clog):这也是ostream
类的一个实例,用于显示错误,但与cerr
不同,错误首先插入到< strong>缓冲区并存储在缓冲区中,直到它没有完全填满。
进一步阅读:basic-input-output-c
答案 4 :(得分:5)
这3个流的不同之处在于缓冲。
请检查以下代码,并通过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";
}
答案 5 :(得分:1)
cout 和 clog 都被缓冲,但 cerr 是非缓冲的,所有这些都是预定义的对象,它们是类ostream的实例。 这三者的基本用途是 cout 用于标准输入,而 clog 和 cerr 用于显示错误。 cerr 未缓冲的要点可能是因为假设缓冲区中有多个输出并且代码中提到了错误异常,那么您需要立即显示该错误,这可以通过 cerr 有效。
如果我错了,请纠正我。
答案 6 :(得分:-2)
cout通常用于在用户屏幕上显示一些语句。 EX- : cout&lt;&lt;&#;; Arlene Batada&#34 ;;
输出:
Arlene Batada