明白な答えは、に出力してはいけないということです
std::cout
。実際の出力はすべてstd::ostream&
、に設定する必要があります。これはデフォルトで設定さstd::cout
れている場合がありますが、他のものに初期化することもできます。
もう1つの明白な答えは、プロセスを開始する前にリダイレクトを実行する必要があるということです。
ただし、に出力するコードを変更できずstd::cout
、プログラムの呼び出しを制御できない(または一部の出力のみを変更したい)場合はstd::cout
、別のをアタッチすることでそれ自体の出力を変更できますstreambuf
。この場合、私はRAIIも使用して、終了時std::cout
に期待するストリームバフを確保します。しかし、次のようなものが機能するはずです。
class TemporaryFilebuf : public std::filebuf
{
std::ostream& myStream;
std::streambuf* mySavedStreambuf;
public:
TemporaryFilebuf(
std::ostream& toBeChanged,
std::string const& filename )
: std::filebuf( filename.c_str(), std::ios_base::out )
, myStream( toBeChanged )
, mySavedStreambuf( toBeChanged.rdbuf() )
{
toBeChanged.rdbuf( this );
}
~TemporaryFilebuf()
{
myStream.rdbuf( mySavedStreambuf );
}
};
(たとえば、ファイルを開くことができない場合など、エラー処理を追加することをお勧めします。)
出力をリダイレクトするゾーンに入るときは、ストリーム(std::cout
、またはその他
ostream
)とファイルの名前を使用してインスタンスを作成するだけです。インスタンスが破棄されると、出力ストリームは以前に出力していた場所への出力を再開します。