Som*_*ude 118
通常,您使用std::cout
正常输出,std::cerr
错误和std::clog
"记录"(这可能意味着您想要的任何意思).
主要区别在于std::cerr
没有像其他两个那样缓冲.
关于旧的C stdout
和stderr
,std::cout
对应于stdout
,while std::cerr
和std::clog
两者对应stderr
(除了std::clog
被缓冲).
riv*_*riv 41
stdout
并且stderr
是不同的流,即使它们都默认引用控制台输出.重定向(管道)其中一个(例如program.exe >out.txt
)不会影响另一个.
通常,stdout
应该用于实际的程序输出,同时应该打印所有信息和错误消息stderr
,这样如果用户将输出重定向到文件,信息消息仍然打印在屏幕上而不是打印到输出文件.
cerr不需要缓冲区,所以它比其他的更快并且不使用cout使用的内存,但是因为cout是缓冲的,所以在某些情况下它更有用.所以:
标准输出流(cout):
cout
是ostream
类的实例.cout
用于在标准输出设备上产生输出,标准输出设备通常是显示屏.需要在屏幕上显示的数据cout
使用插入运算符(<<
)插入标准输出流()中.
未缓冲的标准错误流(cerr): cerr
是用于输出错误的标准错误流.这也是ostream
该类的一个实例.由于cerr
是未缓冲的所以当我们需要立即显示错误消息则使用它.它没有任何缓冲区来存储错误消息并在以后显示.
缓冲标准错误流(clog):这也是ostream
类的一个实例,用于显示错误但不像cerr
错误首先插入缓冲区并存储在缓冲区中,直到它没有完全填充.
进一步阅读:basic-input-output-c
小智 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";
}
Run Code Online (Sandbox Code Playgroud)
来自 C++17 标准文档草案:
30.4.3 窄流对象 [narrow.stream.objects]
istream cin;
1 对象
cin
控制来自与对象关联的流缓冲区的输入stdin
,在<cstdio>
(30.11.1) 中声明。2 对象
cin
初始化后,cin.tie()
返回&cout
。它的状态在其他方面与basic_ios<char>::init
(30.5.5.2)要求的相同。
ostream cout;
3 对象
cout
控制输出到与对象关联的流缓冲区stdout
,在<cstdio>
(30.11.1) 中声明。
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 对象
clog
控制输出到与对象关联的流缓冲区stderr
,在<cstdio>
(30.11.1)中声明。
cout
写信给stdout
; cerr
并clog
以stderr
标准输出 ( stdout
) 旨在接收来自程序的非错误、非诊断输出,例如成功处理的输出,可以显示给最终用户或流式传输到某个进一步的处理阶段。
标准错误 ( stderr
) 用于诊断输出,例如表明程序没有或可能没有产生用户可能期望的输出的警告和错误消息。即使输出数据被输送到进一步的处理阶段,该输入也可以显示给最终用户。
cin
并cerr
与cout
它们都cout
在自己处理 I/O 操作之前刷新。这确保发送到的提示cout
在程序块读取输入之前是可见的cin
,并且cout
在写入错误之前刷新早期的输出 to cerr
,当两者都被定向到同一个终端/文件/等等..
这与clog
- 如果你在那里写它不会被缓冲并且不与任何东西相关联,所以它会在刷新之前缓冲相当数量的日志记录。这产生了最高的消息吞吐量,但意味着消息可能无法快速被潜在消费者读取终端或拖尾日志看到。
归档时间: |
|
查看次数: |
58424 次 |
最近记录: |