开发环境
-
操作系统
-
IDE
C++标志输出流
cout标准输出流,cerr标准错误输出流, clog标准日志输出流
- 都是ostream流对象,在 iostream 中定义
- 都可以把信息重定向输出到文件,包括shell下的重定向和代码级别的重定向
- cout与clog流在内存有缓冲区,用来存放流的数据,当缓冲区写满或向cout流插入一个endl时会立刻输出流中所有数据,然后插件一个换行符
- cerr流是没缓冲区的,目前就输出的目标介质,主要是确保信息及时的输出,以帮助程序的异常分析
CMD下的默认行为
在shell下的c++程序,默认所有的输出会打印在终端界面
#include <iostream>
using namespace std;
int main() {
cout << "cout output test" << endl;
clog << "clog output test" << endl;
cerr << "cerr output test";
return 0;
}
CMD下的重定向
重定向语法
# cmd [1|2][>|>>] filename [2>&1](>是覆盖文件内容,>>是追加内容)
# 重定向cout,覆盖文件内容
应用名 > 需要重定向的文件名
应用名 1> 需要重定向的文件名
# 重定向cout, 追加文件内容
应用名 >> 需要重定向的文件名
应用名 1>> 需要重定向的文件名
# 重定向err,log, 覆盖的方式
应用名 2> 需要重定向的文件名
应用名 2>> 需要重定向的文件名
# 重定向 cout、err、log
应用名 > 需要重定向的文件名 2>&1
重定向cout
重定向err、log
重定向cout、err、log
代码重定向
使用freopen
#include <iostream>
#include <fstream>
// freopen
#include <stdio.h>
using namespace std;
int main() {
freopen("out.txt", "w", stdout);
//这里是重定向了log, err
freopen("log.txt", "w", stderr);
cout << "cout output test" << endl;
clog << "clog output test" << endl;
cerr << "cerr output test" << endl;
return 0;
}
运行效果如下
使用rdbuf
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// cout
ofstream fout("out.txt");
streambuf *originalOutBuf;
//用 rdbuf() 重新定向,返回旧输出流缓冲区指针
originalOutBuf = cout.rdbuf(fout.rdbuf());
// clog
ofstream flog("log.txt");
streambuf *originalLogBuf;
originalLogBuf = clog.rdbuf(flog.rdbuf());
// cerr
ofstream ferr("err.txt");
streambuf *originalErrbuf;
originalErrbuf = cerr.rdbuf(ferr.rdbuf());
cout << "cout output test" << endl;
clog << "clog output test" << endl;
cerr << "cerr output test" << endl;
//恢复cout
cout.rdbuf(originalOutBuf);
fout.close();
//恢复clog
clog.rdbuf(originalLogBuf);
flog.close();
//恢复err
cerr.rdbuf(originalErrbuf);
ferr.close();
cout << "cout output test 2" << endl;
clog << "clog output test 2" << endl;
cerr << "cerr output test 2" << endl;
return 0;
}
运行效果如下