0

私は実行します

$ myprogram.exe

プログラムはint main(int argc, char *argv[]) ディレクトリ パスとして 1 つの引数を取得し、その中のファイルに対して何らかの処理を行います。処理中に、一部の結果が stdout (または stderr) に出力されます。これらの結果をファイルにリダイレクトしたかったのです。だから私は次のように私のプログラムを実行します:

$ myprogram.exe C:\dir > res.txt

結果は引き続き画面に出力され、res.txt空のままになります。どうすれば問題を解決できますか?

4

4 に答える 4

3

プログラムはおそらく、結果を標準出力ストリーム()ではなく、標準エラーストリーム( )に出力します。stderrstdout

リダイレクトするstderrには(ファイル記述子2)、を使用します

myprogram.exe C:\dir 2> res.txt 

との両方 stdoutをリダイレクトするstderr場合は、次のような別のファイルにリダイレクトする必要があります。

myprogram.exe C:\dir > res.txt 2> errors.txt

または、一方のストリームをもう一方のストリームにリダイレクトし、後者をファイルにリダイレクトします

myprogram.exe C:\dir >res.txt 2>&1 
于 2012-11-23T20:32:04.180 に答える
2

覚えておくべきことの 1 つは、">" 演算子は stderr ではなく stdout を出力画面にリダイレクトすることです。 txt、私はそれを試していなかったので、同じファイルへのリダイレクトのためにエラーが発生する可能性がありました。したがって、より安全なアプローチは次のとおりです。

于 2012-11-23T20:40:50.807 に答える
1

引数を正しく送信します. 両方を送信stdoutstderrてファイルに使用する場合:

$ myprogram.exe "C:\dir" > rest.txt 2>&1

>署名の前にリダイレクトするファイル記述子の数を使用できます。を使用する2>&1と、ファイル記述子TWO( stderr) がファイル記述子にリダイレクトされONEstderr出力結果がstdout.

于 2012-11-23T20:52:15.617 に答える
0

この質問は C++ タグで尋ねられているため、プログラム内で出力をリダイレクトする方法を次に示しますstd::cout(std::cerrコードが へのポインターをリークするという点で少しハックですが、std::filebuf必要に応じてこれを防ぐことができます)。

int main() {
    std::filebuf* fb = new std::filebuf;
    fb->open("res.txt", std::ios_base::out);
    std::cout.rdbuf(fb);
    std::clog.rdbuf(fb);
    std::cerr.rdbuf(fb);
    ...
}

もちろん、これは標準 C++ ストリーム オブジェクトに書き込まれた出力でのみ機能します。つまり、stdoutまたはに送信された出力をリダイレクトしませんstderr

于 2012-11-23T20:51:51.107 に答える