开发环境

  • 操作系统
    在这里插入图片描述

  • IDE
    在这里插入图片描述

C++标志输出流

cout标准输出流,cerr标准错误输出流, clog标准日志输出流

  1. 都是ostream流对象,在 iostream 中定义
  2. 都可以把信息重定向输出到文件,包括shell下的重定向和代码级别的重定向
  3. cout与clog流在内存有缓冲区,用来存放流的数据,当缓冲区写满或向cout流插入一个endl时会立刻输出流中所有数据,然后插件一个换行符
  4. 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;
}

运行效果如下
在这里插入图片描述

参考资料

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐