リダイレクション状態の判定方法は? – プログラミング – Home

リダイレクション状態の判定方法は?
 
通知
すべてクリア

[解決済] リダイレクション状態の判定方法は?


ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

コンソールアプリを作成中です。
実行中の画面情報を画面と共にファイルにも出力しようとしています。
それで実行時にリダイレクト出力されているか、されていないかの判定方法を
知りたいです。

// 出力用関数(仮)
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…)


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

if( _fileno( stdout ) == 1 )
とかで可能でしょうか?
ちょっと今 VisualStudio 再インストール中なので試せません。


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

シャノンさん。
いつもお世話になっています。

_fileno のヒントを頼りに探したら include フォルダに isatty.c を発見。
見覚えのある isatty だったので昔を思い出して判定関数を作成しました。

// リダイレクト出力の判定
bool isRedirectOutput( FILE* fp )
{
 return !_isatty( _fileno(fp) );
}
見事これで判定できました。

> if( _fileno( stdout ) == 1 )
これでも出来ました。

シャノンさんありがとうございました。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

え? 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 とはならない


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

> え? fileno(stdout)==1 は常に成り立つはずだが(リダイレクトの有無によらず)
そうですね。
最初は以下のようにしてました。

// リダイレクト出力の判定
bool isRedirectOutput( FILE* fp )
{
 return !(fileno(fp) == 1);
}
これだとリダイレクト出力のときも false ですね。
確認はリダイレクト出力なしだけでこれでも動くと錯覚していたようです。
リダイレクト出力ありでの確認をしていなかったです。

> > if( _fileno( stdout ) == 1 )
> これでも出来ました。
訂正。
[正しく動かない]でした。

tetrapod さんありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました