在重定向到文件后,使用cout或cerr将其输出到控制台

Use cout or cerr to output to console after it has been redirected to file

本文关键字:cerr 输出 控制台 使用 文件 重定向 cout      更新时间:2023-10-16

将cout或cerr重定向到文件很容易。我可以使用它将第三方输出重定向到文件。但是,在我将第三方输出重定向到一个文件之后,我自己如何使用cout来输出到控制台呢?

我是RAII的忠实粉丝,所以我曾经编写过这个小助手类。它将重定向流,直到它超出作用域,此时它将恢复原始缓冲区。很方便的。:)

class StreamRedirector {
public:
    explicit StreamRedirector(std::ios& stream, std::streambuf* newBuf) :
        savedBuf_(stream.rdbuf()), stream_(stream)
    {
        stream_.rdbuf(newBuf);
    }
    ~StreamRedirector() {
        stream_.rdbuf(savedBuf_);
    }
private:
    std::streambuf* savedBuf_;
    std::ios& stream_;
};

可以这样使用:

using namespace std;
cout << "Hello stdout" << endl;
{
    ofstream logFile("log.txt");
    StreamRedirector redirect(cout, logFile.rdbuf());
    cout << "In log file" << endl;
}
cout << "Back to stdout" << endl;

保存缓冲区并稍后恢复:

std::streambuf *buf = std::cout.rdbuf(); //save
// Do other stuff
std::cout.rdbuf(buf); // restore