コンソールアプリを作成中です。
実行中の画面情報を画面と共にファイルにも出力しようとしています。
それで実行時にリダイレクト出力されているか、されていないかの判定方法を
知りたいです。
// 出力用関数(仮)
void printResult( const char string[], size_t len )
{
if ( リダイレクト出力の判定関数 ){
fprintf( stdout, %s\n, string );
fprintf( stderr, %s\n, (string + len) );
}
else{
fprintf( stdout, %s\n, (string + len) );
}
}
上記のように組もうとしています。
リダイレクト出力されていないときには fprintf( stdout, … ) 行のみを
処理するようにしたいです。
出来ればファイル・ポインタ(C言語のfp)より判定できれば嬉しいです。
無理なら Win32 API の方法もありだと思っています。
むかし MS-DOS にはあったのですが Windows ではどうなりますか?
[環境環境]
Windows XP SP3
VC++2003(SDK)
[実行環境]
Windows OS 全般(95/98/Me/NT/2000/XP/Vista…)
if( _fileno( stdout ) == 1 )
とかで可能でしょうか?
ちょっと今 VisualStudio 再インストール中なので試せません。
シャノンさん。
いつもお世話になっています。
_fileno のヒントを頼りに探したら include フォルダに isatty.c を発見。
見覚えのある isatty だったので昔を思い出して判定関数を作成しました。
// リダイレクト出力の判定
bool isRedirectOutput( FILE* fp )
{
return !_isatty( _fileno(fp) );
}
見事これで判定できました。
> if( _fileno( stdout ) == 1 )
これでも出来ました。
シャノンさんありがとうございました。
え? fileno(stdout)==1 は常に成り立つはずだが(リダイレクトの有無によらず)
# 自分のプログラム中で自分でリダイレクトすれば別
isatty で判定するのは正しいのだが isatty の仕様が求める動作と同じかどうかは
要検討であろうと思われる。
Windows の場合
hoge > logfile.txt の場合 isatty(fileno(stdout))==0 が成立
hoge > nul の場合 isatty(fileno(stdout))==0 とはならない
ウチの UN*X の場合
hoge > /dev/null の場合 isatty(fileno(stdout))==0 が成立
hoge > /dev/tty0p0 の場合 isatty(fileno(stdout))==0 とはならない
> え? fileno(stdout)==1 は常に成り立つはずだが(リダイレクトの有無によらず)
そうですね。
最初は以下のようにしてました。
// リダイレクト出力の判定
bool isRedirectOutput( FILE* fp )
{
return !(fileno(fp) == 1);
}
これだとリダイレクト出力のときも false ですね。
確認はリダイレクト出力なしだけでこれでも動くと錯覚していたようです。
リダイレクト出力ありでの確認をしていなかったです。
> > if( _fileno( stdout ) == 1 )
> これでも出来ました。
訂正。
[正しく動かない]でした。
tetrapod さんありがとうございました。