2017-02-22 4 views
1

を標準入力にリダイレクトすることを可能にする:私はあまりにも多くの引数をキャッチするコードを書かれているは、1つのファイルのみが、私は現在、使用してC++プログラムを書いています

[prog] - - - - - - - - - - - - read from stdin 
[prog] [filename] - - - - - - will test and open file 
[prog] < [filename] - - - - - will redirect the filename to stdin 

、そしてそれは、ユーザーが

をしようとした場合を除いて、すべてが、動作します
[prog] < [filename] [filename] 

2番目のファイル名が開きます。

このケースが発生しないようにするにはどうすればよいですか。ご検討いただきありがとうございます。

+2

簡単に言えば、入力できません。 –

答えて

3

プロセスが標準入力からプロセスの標準入力を明示的にリダイレクトしたかどうかを正式に判断する方法はありません。

しかし、isatty()は、指定されたファイル記述子が対話型端末に接続されているかどうかの指示を返すPOSIXプラットフォーム上で実行すると、非常に知識のある推測を行うことができます。したがって、isatty(0)(標準入力ファイル記述子#0)かどうかを確認できます。その場合、これはプロセスの標準入力が依然として対話式キーボード入力に接続されており、リダイレクトされていないことを意味します。

これは100%完全ではありません。巧妙なソング・ダンス・ルーチンを実行することは可能であり、擬似ttyデバイスを使用すると、対話型端末と区別できないプロセスの標準入力にプロセスを接続することができますが、入力は実際には他のこれは非常にまれで、典型的な園芸品のアプリケーションでは、isatty()で十分です。したがって、main()isatty(0)を確認できます。入力されている場合は、入力がリダイレクトされていないことを示す良好な指標です。

しかし、isatty(0)が真でない場合、標準入力がリダイレクトされる可能性がありますが、それがパイプかプレーンなファイルかその他のものかどうかを調べるには追加のスルーティングが必要になります。

あなたの全体のゲームプランは次のとおりです:argvがファイル名を指定しているかどうかを確認してください。もしそうなら、isatty(0)なら、あなたは2つの可能性のある入力ファイルを扱います。

+0

興味深い。私はisatty()をチェックアウトしてテストしますが、私はそれについて聞いていませんでした。 – TheTotalJim

+0

これは私のニーズに対応していますが、100%確実に保証されるわけではありません。 – TheTotalJim

1

このケースが発生しないようにするにはどうすればよいですか。ご検討いただきありがとうございます。

これを防ぐことはできません。ユーザーは、他のツールを使用してファイルを連結することによって、そのような制限を回避することができます。たとえば、ユーザーは簡単に使用できます。

cat filename1 filename2 | program 
+0

Sam Varshavchikの答えでは、私が説明した単純なケースを防ぐテストケースを作ることができますが、この情報に感謝します。私はこれを試して何が起こるか見る。学校のプロジェクトなので、説明したケースを徹底的に監視する必要はありませんが、教師にこれらの特別なケースをテストしてもらうことができれば、それは悪いことではないと確信しています。 – TheTotalJim

関連する問題