cout,cerr,clock在c ++中的iostream头文件有什么区别? 何时使用哪一个?

我试图研究互联网上的coutcerrclog之间的区别,但找不到完美的答案。 我还不清楚什么时候用哪个。 任何人都可以向我解释,通过简单的程序,并说明何时使用哪一个完美的情况?

我访问了这个网站 ,它显示了一个关于cerrclog的小程序,但是在那里获得的输出也可以用cout获得。 所以,我很困惑每个人的确切用途。

stdout和stderr是不同的stream,即使它们都默认引用控制台输出。 redirect(pipe道)其中之一(如program.exe >out.txt )不会影响其他。

一般情况下,stdout应该用于实际的程序输出,而所有的信息和错误信息应该打印到stderr,这样如果用户将输出redirect到一个文件,信息信息仍然被打印在屏幕上而不是输出文件。

通常你使用std::cout作为正常输出, std::cerr作为错误,而std::clog作为“logging”(可以表示任何你想要的意思)。

主要的区别是std::cerr没有像其他两个缓冲。


相对于旧的stdoutstderrstd::cout对应于stdout ,而std::cerrstd::clog都对应于stderr (除了std::clog被缓冲了)。

cerr不需要缓冲区,所以它比其他的更快,并且不使用cout使用的内存,但是因为cout被缓冲了,所以在某些情况下更有用。 所以:

  • 使用cout作为标准输出。
  • 使用cerr来显示错误。
  • 使用堵塞logging。

标准输出stream(cout): coutostream类的实例。 cout用于在通常是显示屏幕的标准输出设备上产生输出。 需要在屏幕上显示的数据使用插入运算符( << )插入到标准输出stream( cout )中。

未缓冲的标准错误stream(cerr): cerr是用于输出错误的标准错误stream。 这也是ostream类的一个实例。 由于cerr无缓冲的,因此在需要立即显示错误消息时使用它。 它没有任何缓冲区来存储错误信息并稍后显示。

缓冲的标准错误stream(clog):这也是ostream类的一个实例,用于显示错误,但与cerr不同,错误首先被插入到缓冲区 ,并存储在缓冲区中,直到没有完全填充。

进一步阅读: basic-input-output-c

coutclog都被缓冲,但是cerr没有被缓冲,所有这些都是预定义的对象,它们是类ostream的实例。 这三个的基本用途是cout用于标准input,而clogcerr用于显示错误。 cerr未被缓冲的主要原因可能是因为假设你在缓冲区中有几个输出,并且在代码中提到了一个错误exception,那么你需要立即显示那个错误,这可以通过有效的cerr来完成。

如果我错了,请纠正我。

cout通常用于在用户屏幕上显示一些语句。 ex-:cout <<“Arlene Batada”;

输出:

阿琳巴塔达

这三个stream的差别在于缓冲。

  1. 用cerr,输出冲洗
    • 立即(因为cerr不使用缓冲区)。
  2. 堵塞,输出冲洗
    • 完成当前function后
    • 显式调用函数flush。
  3. 随着cout,输出冲洗
    • 在调用任何输出stream之后(cout,cerr,clog)。
    • 完成当前function后
    • 显式调用函数flush。

请检查以下代码,并通过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"; }