0

重複の可能性:
cin と cout をファイルにリダイレクトする方法は?

std::cout および tecla というサードパーティ ライブラリを介して端末に書き込むスパゲッティ コードをデバッグしています。

http://www.astro.caltech.edu/~mcs/tecla/

ファイルにリダイレクトできるように、標準出力に自分自身をフックしたいと思います。ファイルに保存する前に、文字列を 16 進数表現に変換して、文字列に含まれるすべての制御文字をより簡単に識別できるようにします。

プログラムがどのように動作しているかをよりよく理解するために、プログラム内のさまざまなイベントをこのファイルに記録することもできます。

これを行う方法について何か提案はありますか?

アップデート

私のプログラムは、標準入力を介して端末でコマンドも受け取ります。それはやっているようです:

myprogram 9889 > output.txt

あるいは

マイプログラム 9889 | xxd

入力されたコマンドにプログラムを応答させることができないように、何らかの方法でプログラムを中断します。

プロンプト (>) は、output.txt には表示されません。

4

5 に答える 5

1

std::cout小さなテストプログラムを除いて、書き込みは非常に悪い習慣です。しかし、あなたはそれに固執しているので、コードでは変更できません:streambufストリームが書き込む先を次のように変更することができます:

class WrappedOutputFilebuf : public std::filebuf
{
    std::ostream& mySavedStream;
    std::streambuf* mySavedStreambuf;
public:
    WrappedOutputFilebuf( std::ostream& stream, std::string filename )
        : mySavedStream( stream)
        , mySavedStreambuf( stream.rdbuf() )
    {
        open( filename.c_str(), std::ios_base::out );
        if ( ! is_open() ) {
            throw some_error;
        }
        stream.rdbuf( this );
    }
    ~WrappedOutputFilebuf()
    {
        mySavedStream.rdbuf( mySavedStreambuf );
    }
};

次に、どこかで宣言します。

WrappedOutputFilebuf w( std::cout, fileName );

変数がスコープ内にある限り、std::cout指定したファイルに出力されます。

于 2013-01-18T16:58:26.857 に答える
1

UNIX-oid システムを使用している場合は、(他の回答に見られるように) ファイルに直接保存する以外に、HEX エンコーディングで表示し、 と を組み合わせてカーソル キーで参照できhexdumpますless

./myProgram | hexdump -C | less

出力は次のようになります。

00000000  73 6f 6d 65 20 63 72 79  70 74 69 63 20 6f 75 74  |some cryptic out|
00000010  70 75 74 20 66 72 6f 6d  20 6d 79 20 70 72 6f 63  |put from my proc|
00000020  65 73 73 0a                                       |ess.|
00000024

ファイルを表示 (less を使用して閲覧) + 保存するには、tee次のコマンド パイプにコマンドを追加します。

./myProgram | hexdump -C | tee output.txt | less    #for hex-encoded file content

./myProgram | tee output.txt | hexdump -C | less    #for 1:1 file content

ファイル/ビューにも出力を含めるにはstderr、プロセス コマンド ラインの先頭に を追加して、処理する前に 2 つのチャネルをマージします2>&1

./myProgram 2>&1 | ...
于 2013-01-18T16:12:42.343 に答える
0

出力をファイルにリダイレクトすることは、通常、コード自体ではなく、コマンド ラインで行うことです。例えば:

myProgram > output.txt
于 2013-01-18T16:10:35.907 に答える
0

次のように入力してプログラムを実行するだけです。

myprogram > output.txt

次に、WinHex や ghex2 などの 16 進エディターを使用して output.txt ファイルを表示します。

于 2013-01-18T16:10:50.007 に答える
0

デバッグしているプログラムが端末と通信しているかどうかに敏感な場合はscreen、 、特にそのログ機能 を参照してください。

于 2013-01-18T18:15:27.093 に答える