5

cout次のように、プログラムを実行して出力ファイルに リダイレクトしています。

./program < infile.in > outfile.o  

コマンド ラインからオプション (「-h」または「--help」) を読み込み、ヘルプ メッセージをターミナルに出力できるようにしたいと考えています。これを行う方法はありますがcout、プログラムの残りの部分から定期的に出力ファイルに移動する方法はありますか?

coutそのようなものに使用するのに適切なオブジェクトでしょうか?

4

6 に答える 6

16

cerr を使用してヘルプ メッセージを STDERR に出力する必要がありますが、これは outfile.o へのリダイレクトには含まれません。

与えられた./program < infile.in > outfile.o

cout << "This writes to STDOUT, and gets redirected to outfile.";
cerr << "This doesn't get redirected, and displays on screen.";

後で、STDOUT と STDERR の両方をリダイレクトする場合は、次のようにします。

./program < infile.in &> outfile.o

STDERR のみをリダイレクトするが、STDOUT は表示できるようにする場合は、次を使用します。

./program < infile.in 2> outfile.o

Bash のリダイレクトは、ほとんどの人が認識しているよりも複雑であり、多くの場合、最も単純な形式 (">") 以外はすべて見落とされます。

于 2010-01-27T21:23:55.947 に答える
3

Linux を使用している場合は、疑似デバイス/dev/ttyを使用して、制御端末 (存在する場合) に出力できます。これは とstderr同様にリダイレクトされても機能しstdoutます。他のオペレーティング システムでも同様のメカニズムが提供されている場合があります。

例えば

#include <iostream>
#include <ostream>
#include <fstream>

int main()
{
        std::ofstream term("/dev/tty", std::ios_base::out);

        term << "This goes to terminal\n";
        std::cout << "This goes to stdout\n";

        return 0;
}

次のように動作します。

$ ./a.out
これは stdout に移動します
これはターミナルに行きます
$ ./a.out >/dev/null
これはターミナルに行きます

2 つのストリームが別々にバッファリングされている場合、それらが同じデバイスに出力されている場合、相対的な順序は必ずしも保持されないことに注意してください。これは、適切なタイミングでストリームをフラッシュすることで調整できます。

于 2010-01-27T22:28:16.610 に答える
2

~$ cmd | tee log_filestdoutファイル端末に複製する 端末
~$ cmd 2>log_fileに印刷stdoutstderrてファイルに出力する

于 2010-01-27T21:23:53.140 に答える
1

私が行ったことの 1 つは、これが常に適切であるとは言いませんが、この署名のようなものを持つモジュールを作成することです。

void write_out(ostream &o);

次に、fstream オブジェクトを作成して渡すか、cout と cerr を渡すことができます。これは、端末上で何が起こっているかを確認したい場合や、ログファイルだけが必要な場合にログ記録コードを作成する場合に役立ちます。

HTH。

于 2010-01-27T22:11:26.513 に答える
1

ヘルプ メッセージを stderr に出力したい場合があります。Stderr は通常、非通常の出力に使用され、使用法の段落をそのような出力と見なすことができます。

于 2010-01-27T21:23:36.277 に答える
0

cout の代わりに cerr を使用する必要があります。シェル リダイレクトを使用すると、stderr (cerr) ではなく、stdout (cout) のみがリダイレクトされます。

于 2010-01-27T21:23:14.730 に答える