跳到主要内容

C++ clog 流

clogcerr 都与 stderr 相关联,但它与 cerr 的不同之处在于 clog 中的流是缓冲的,并且不会自动与 cout 绑定。

缓冲输出比非缓冲输出更高效。在缓冲输出的情况下,所有输出都保存在一个变量中,并一次性写入磁盘。对于非缓冲输出,我们必须持续写入磁盘。

对于关键性错误,缓冲输出并不是首选。在系统崩溃的情况下,可能会出现输出仍在缓冲区中而未写入磁盘的情况,错误信息无法被检索。在系统崩溃的情况下,我们不能负担丢失错误数据的风险,所以即使慢一些,我们还是持续将关键性错误写入磁盘。

clog 通常用于记录日志。对于非关键性事件日志,效率更重要,因此更倾向于使用 clog 而不是 cerr

clog 声明

extern ostream clog;

它定义在 <iostream> 头文件中。

clog 对象在第一次构造类型为 ios_base::Init 的对象时或之前就已确保初始化。clog 没有与任何其他流绑定。

"clog" 中的 "c" 代表 "character"(字符),因此 clog 意味着 "字符日志"。

clog 对象与插入运算符(<<)一起使用,用于显示字符流。通常的语法是:

clog << varName;

clog << "Some String";

可以将提取运算符与变量、字符串和操作符(如 endl)的组合多次使用:

clog << var1 << "Some String" << var2 << endl;

示例:clog 如何工作?

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
char fileName[] = "data.txt";
ifstream infile(fileName);

if(infile)
cout << infile.rdbuf();

else
clog << "打开文件时出错 " << fileName << endl;
return 0;
}

在这个程序中,因为这种错误对应用程序不是关键性的,所以使用 clog 来流式传输日志数据更高效。

当你运行程序时,如果打开文件出错,输出将会是:

打开文件时出错 data.txt