2

私の問題は、プロジェクトのさまざまなファイルにいくつかの cout があることです。それらすべてをリダイレクトして.txtファイルに保存したいと思います。これまでに達成したことは、ファイルに保存される cout が 1 つだけであることです。一度に読むために、coutごとに個別の.txtを作成したくありません。私のコードは次のようになります。

#include <fstream>
#include <string>
#include <iostream>

int main()
{
    std::ofstream out("out.txt");
    std::cout.rdbuf(out.rdbuf()); 

    std::cout << "get it3";
    std::cout << "get it4"; 
}

両方のcoutは 1 つのファイルにありますが、2 つの異なるファイルにあると仮定すると、1 つの.txtにリダイレクトして保存する方法は?

4

1 に答える 1

3

明白な答えは、に出力してはいけないということです 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)とファイルの名前を使用してインスタンスを作成するだけです。インスタンスが破棄されると、出力ストリームは以前に出力していた場所への出力を再開します。

于 2012-12-18T09:00:46.237 に答える