stdinに入力があるかどうかをテストしたいと思います。私はうまくいくソリューションを見つけましたが、彼らは醜いですし、自分のソリューションがきれいであることが好きです。 Linux上でstdinにC++(Windowsおよび/またはLinux)の入力があるかどうかテストしてください
私はこれを使用します。
bool StdinOpen() {
FILE* handle = popen("test -p /dev/stdin", "r");
return pclose(handle) == 0;
}
私は、私はより多くのエラー処理を追加する必要があることを知っているが、それはポイント以外にもあります。私はこれを使用してWindows上で
:
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
Linux用の罰金ですが、私は私が(test -f $file
のためのように、あなたがfopen($file, "r") != NULL
を行う)パイプを使用せずに呼び出すことができます同等のAPIであるかを知りたいこと。私はopen("/dev/stdin", "r")
と同じことをすることができますが、私はそれを行うための最善の方法を知りたいと思います。
概要:あなたは窓のためのよりよい解決策を知っていれば、私は、私がLinux用test -p /dev/stdin
の代わりに使用できるAPIを知りたい、と。
標準入力が(パイプではなく)ファイルハンドルである場合、あなたの 'PeekNamedPipe'ソリューションは失敗します。また、 'handle'変数は静的であってはいけません。あなたのアプリケーションの実行中にハンドルがリダイレクトされた場合は、後で自分自身を驚かせるでしょう。 –
@Billy:私はハンドルがランダムにリダイレクトされるとは思わない。確かに、あなたは何をstdinと考えるかを変えるかもしれないが、古いハンドルはまだそこにある。しかし、私は最初の部分について同意します。 – Mehrdad
Lionel BはLinux用のコードをhttp://bytes.com/topic/c/answers/841283-how-make-non-blocking-call-cinで提供しています。 –