1

デバッグ中に、コンソール出力をコンソールに表示し、バックアップをファイルに保存したいと考えています。Windows にはティーがありませんが、追加できます。フォルダーが c:\bin\ で、正常に動作するとします。そして、システムのPATHに追加しました。

問題は、「[ ]| tee[.exe] output.txt」または「 | tee[.exe] output.txt」を設定しても機能しないことです。output.txt が見つからないだけです。また、デバッグ中の VC ディレクトリまたは環境に c:\bin\ パスを明示的に追加し、環境をマージして yes にしようとしました。

"> output.txt" は問題なく動作します。

これを解決する方法を知っている人はいますか? どうもありがとう!

4

2 に答える 2

2

| tee.exe output.txtプロジェクトのプロパティ「デバッグ|コマンド引数」に文字列を入れていると思います。

残念ながら、そのプロパティはリダイレクト演算子のみをサポートしており、パイプ演算子はサポートしていません。preopertyに | tee.exe output.txt文字列があり、コマンド ライン引数をダンプするプログラムを実行すると、その情報が引数として渡されていることがわかります。「Debugging | Command Argument」は、実際には本格的なシェル ( などcmd.exe) によって処理されるわけではありません - IDE が単純なリダイレクトをサポートしているだけです (実際には、予想以上にサポートしているようです)。

http://msdn.microsoft.com/en-us/library/kcw4dzyf.aspxから:

You can use the following redirection operators in this box:

    < file
        Reads stdin from file.

    > file
        Writes stdout to file.

    >> file
        Appends stdout to file.

    2> file
        Writes stderr to file.

    2>> file
        Appends stderr to file.

    2> &1
        Sends stderr (2) output to same location as stdout (1).

    1> &2
        Sends stdout (1) output to same location as stderr (2).

>>コマンドを使用してプログラムの出力をファイルにリダイレクトし、tail-fコマンドを使用してファイルに追加されたものを表示することにより、探しているものの限定バージョンを作成できます。これを行う場合、I/O がバッファリングされないように、おそらくsetvbuf( stdout, NULL, _IONBF, 0 )最初に呼び出したいと思うでしょう。main()そうtail -fしないと、バッファがフラッシュされるまで表示されません。出力操作が発生するたびに表示したいと思うでしょう。

もう 1 つのオプションは、コンソール ウィンドウの「スクリーン バッファの高さ」プロパティを大きくすることです。新しい Windows マシンを入手したときに最初に行うことの 1 つは、その値を 3000 程度に設定することです。次に、通常どおりにプログラムをデバッグしてコピーします。 /コンソール ウィンドウを閉じる前に、その内容を貼り付けます。

于 2013-01-25T03:42:22.800 に答える
0

printfこの目的には使用しない方がよいでしょう。代わりに、独自の関数を作成してください。printfのように、フォーマットされた入力を受け取ります-可変数の引数(...)を持ちます。その関数は、printf を使用してコンソールに表示し、ファイルに書き込まれたバッファを取得し、出力をデバッグ ウィンドウなどに送信します。デバッグ/リリース ビルドに応じてカスタマイズできます。

次のようになります (小さな間違いがあるかもしれません):

void PrintDebuggingInfo(const char* pFormatString, ...) 
{    
    va_list  arguments;

    char OutputString[1024];

    va_start(pFormatString, argument);    
    vsprintf(OutputString,  pFormatString, argument); // Generate string

   // Now use `OutputString` as you wish! 
}

の他のバリアントを使用することもできますvsprintf。実際、すべてのフォーマット済み関数はこの関数のみを使用します!

于 2013-01-25T03:02:26.883 に答える