他の回答はこれについて何をすべきかについて言及していないので、ここでそれを提供します。coutが管理することになっているバッファを保存して復元する必要があります。例えば:
#include <fstream>
#include <iostream>
// RAII method of restoring a buffer
struct buffer_restorer {
std::ios &m_s;
std::streambuf *m_buf;
buffer_restorer(std::ios &s, std::streambuf *buf) : m_s(s), m_buf(buf) {}
~buffer_restorer() { m_s.rdbuf(m_buf); }
};
int main()
{
std::ofstream log("oops.log");
buffer_restorer r(std::cout, std::cout.rdbuf(log.rdbuf()));
std::cout << "Oops!\n";
return 0;
}
これで、プログラムの最後に破棄されるcout
前に'バッファが置き換えられると、そのバッファが破棄されると正しいことが起こります。cout
cout
標準のioを単純にリダイレクトする場合、通常、環境にはすでにそれを実行する機能があります(たとえば、シェルでのioリダイレクト)。上記のコードではなく、おそらくプログラムを次のように実行します。
yourprogram > oops.log
また、覚えておくべきことの1つstd::cout
は、他のグローバル変数と同じ欠点を持つグローバル変数です。それを変更したり使用したりする代わりに、通常の手法を使用してグローバル変数をまとめて回避することをお勧めします。たとえば、std::ostream &log_output
コードを直接使用する代わりに、パラメータを渡してそれを使用することができcout
ます。