2012-03-18 8 views
1

、入力要求があるたびにプログラムがINPUT.TXTからの入力を取得することができますコンソールトリック入力がファイルからプログラムにストリーミングされているかどうかを調べる方法はありますか? Windowsので

someprogram.exe < input.txt 

が存在します。 入力が別のファイルから読み込まれたときにプログラムの動作が異なるようにしたい。それを行う方法はありますか?どうやって?

+0

「別のファイルを読む」とはどういう意味ですか?入力が 'コンソール経由のファイル 'から来たものかどうか確認したいのですか?あなたの例のように? – gideon

+2

プログラムの標準入力と出力がコンソール(TTY)またはパイプに接続されているかどうかを検出したい場合は、不運です.C++でこれを行う標準的な方法はありません。 –

+0

ありがとう@JonPurdy – cngkaygusuz

答えて

1

私は(ただし、わからない)そう思うが、ここでは、代替(エラーチェックを省略)ではありません。

int main(int argc, char **argv) 
{ 
    std::istream * pstream = &std::cin; 

    std::ifstream fin; 
    if (argc > 1) 
    { 
     fin.open(argv[1]); 
     pstream = &fin; 
    } 

    // use pstream instead of cin 
} 

その後、あなたは、コマンドライン引数としてファイルの名前を渡します。

+1

'pstream'は条件付き演算子を使って初期化すると参照型になります。 –

+0

@エミール:いいえ、それは問題を引き起こします。条件に既存の変数または一時的な参照を割り当てることはできません。既存の変数はコピー(const-ref、コピー不可能なiostreamのエラー)または移動(rvalue ref)されます。条件付き演算子は、2つのオペランドがまったく同じ型および値のカテゴリである場合にのみ型識別を保持します。この場合、それらは表現の型を非標準の 'std :: istream'型のprvalueカテゴリ(両方のオペランドの共通型)にしています(左辺値と右辺値のどちらかではない)。 – Xeo

+0

@ Xeo:すべての価値カテゴリのビジネスについてはわかりませんが、これはGCC 4.7で正常に動作します。予想される動作です: 'std :: istream&stream =(argc> 1)? (fin.open(argv [1])、fin):std :: cin; ' –

0

はい、ほとんどのプラットフォームで利用可能な関数isattyを使用してください。 Windowsでは_isattyと呼ばれるように見えます(理由はわかりません)。