提问人:Arlene Batada 提问时间:5/27/2013 最后编辑:Kashif Faraz ShamsiArlene Batada 更新时间:6/24/2022 访问量:90761
c++ 中 iostream 标头的 cout、cerr、clog 有什么区别?何时使用哪一个?
What is the difference between cout, cerr, clog of iostream header in c++? When to use which one?
问:
我试着在互联网上研究 和 之间的区别,但找不到完美的答案。我仍然不清楚何时使用哪个。谁能通过简单的程序向我解释并说明何时使用哪一个的完美情况?cout
cerr
clog
我访问了这个网站,它显示了一个小程序,但是在那里获得的输出也可以使用。所以,我对每个人的确切用途感到困惑。cerr
clog
cout
答:
通常,用于正常输出、错误和“日志记录”(这可能意味着您希望它的任何含义)。std::cout
std::cerr
std::clog
主要区别在于它不像其他两个那样缓冲。std::cerr
相对于旧的 C 和 ,对应于 ,而 和 两者都对应(除了缓冲)。stdout
stderr
std::cout
stdout
std::cerr
std::clog
stderr
std::clog
评论
clog
cerr
clog
cout
cerr
clog
clog
cout
stdout
并且是不同的流,即使默认情况下它们都引用控制台输出。重定向(管道)其中一个(例如)不会影响另一个。stderr
program.exe >out.txt
通常,应用于实际程序输出,而所有信息和错误消息都应打印到 ,以便如果用户将输出重定向到文件,信息消息仍打印在屏幕上,而不是输出文件。stdout
stderr
- 使用 cout 作为标准输出。
- 使用 cerr 显示错误。
- 使用 clog 进行日志记录。
评论
cout 和 clog 都是缓冲的,但 cerr 是未缓冲的,所有这些都是预定义的对象,它们是 ostream 类的实例。 这三者的基本用途是 cout 用于标准输出,而 clog 和 cerr 用于显示错误。 cerr 未缓冲的主要原因可能是因为假设缓冲区中有多个输出,并且代码中提到了错误异常,那么您需要立即显示该错误,这可以通过 cerr 有效地完成。
如果我错了,请纠正我。
标准输出流 (cout):是类的实例。 用于在标准输出设备(通常是显示屏)上产生输出。需要在屏幕上显示的数据使用插入运算符 () 插入到标准输出流 () 中。cout
ostream
cout
cout
<<
未缓冲标准错误流 (cerr):是用于输出错误的标准错误流。这也是该类的一个实例。As 是 un-buffered,因此当我们需要立即显示错误消息时使用它。它没有任何缓冲区来存储错误消息并在以后显示。cerr
ostream
cerr
缓冲标准错误流(堵塞):这也是类的一个实例,用于显示错误,但与错误不同的是,它首先插入缓冲区并存储在缓冲区中,直到它未完全填充。ostream
cerr
延伸阅读:basic-input-output-c
评论
until it is not fully filled.
--这不应该说吗?until it IS fully filled
这 3 个流的区别在于缓冲。
- 使用 cerr 时,输出刷新
- 立即(因为 CERR 不使用缓冲液)。
- 堵塞时,输出冲洗
- 完成当前功能后。
- 显式调用函数 flush。
- 使用 cout 时,输出会刷新
- 在调用任何输出流(cout、cerr、clog)之后。
- 完成当前功能后。
- 显式调用函数 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";
}
来自 C++17 标准文档草案:
30.4.3 窄流对象 [narrow.stream.objects]
istream cin;
1 该对象控制来自与该对象关联的流缓冲区的输入,在 (30.11.1) 中声明。
cin
stdin
<cstdio>
2 对象初始化后,返回 .否则,其状态与 (30.5.5.2) 的要求相同。
cin
cin.tie()
&cout
basic_ios<char>::init
ostream cout;
3 对象控制输出到与对象关联的流缓冲区,在 (30.11.1) 中声明。
cout
stdout
<cstdio>
ostream cerr;
4 对象控制输出到与对象关联的流缓冲区,在 (30.11.1) 中声明。
cerr
stderr
<cstdio>
5 对象初始化后,为非零并返回 .否则,其状态与 (30.5.5.2) 的要求相同。
cerr
cerr.flags() & unitbuf
cerr.tie()
&cout
basic_ios<char>::init
ostream clog;
6 对象控制输出到与对象关联的流缓冲区,在 (30.11.1) 中声明。
clog
stderr
<cstdio>
讨论。。。
cout
写入 stdout
;CERR
和 CLOG
到 STDERR
标准输出 () 旨在接收来自程序的无错误、非诊断输出,例如成功处理的输出,可以显示给最终用户或流式传输到某个进一步的处理阶段。stdout
标准错误 () 用于诊断输出,例如警告和错误消息,指示程序尚未或可能未生成用户可能期望的输出。例如,即使输出数据通过管道传递到进一步的处理阶段,也可以将其显示给最终用户,或者可以将其重定向到日志文件。stderr
CIN
和 CERR
与 COUT
相关联
它们都会在自己处理 I/O 操作之前进行刷新。这确保了发送到的提示在程序块读取输入之前是可见的,并且之前的输出在写入错误之前被刷新,当两者都被定向到同一个终端/文件/等时,这将使消息按其生成的时间顺序保持。cout
cout
cin
cout
cerr
这与 - 如果您在那里写入,它不会被缓冲并且不与任何内容绑定,因此它将在刷新之前缓冲相当数量的日志记录。这会产生最高的消息吞吐量,但这意味着即使错误被写入并且位于屏幕上或日志中,这些消息可能无法快速被阅读终端或跟踪日志的潜在消费者看到。clog
cerr
评论
stdout
stdin
cin
stderr
clog
cerr