2

cout または cerr をファイルにリダイレクトするのは簡単です。これを使用して、サードパーティの出力をファイルにリダイレクトできます。ただし、サード パーティの出力をファイルにリダイレクトした後、自分で cout を使用してコンソールに出力するにはどうすればよいですか?

4

2 に答える 2

4

私は 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;
于 2013-01-11T23:03:37.237 に答える
4

バッファーを保存し、後で復元します。

std::streambuf *buf = std::cout.rdbuf(); //save
// Do other stuff
std::cout.rdbuf(buf); // restore
于 2013-01-11T22:37:32.733 に答える