Temel olarak stdin'in giriş yapıp yapmadığını test etmek istiyorum (örneğin, eğer yankı ve boru gibi). Çalışan çözümler buldum ama çirkinler ve çözümlerin temiz olmasını seviyorum. linux üzerindestdin C++ (windows ve/veya linux) için giriş yapıp yapmadığını test edin
Bunu kullanın:
bool StdinOpen() {
FILE* handle = popen("test -p /dev/stdin", "r");
return pclose(handle) == 0;
}
ben daha fazla hata işleme eklemek gerektiğini biliyorum, ama bu noktada dışında bulunuyor. Pencerelerde
Bunu kullanın: linux için iyi, ama ben bir boru kullanmadan çağırabilir eşdeğer API'leri (test -f $file
için gibi fopen($file, "r") != NULL
yapın) ne olduğunu bilmek istiyorum
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
. Ben open("/dev/stdin", "r")
yapabildiğim ve aynı şeyi yapabildiğim bir mürekkebim var ama bunu yapmanın en iyi yolunu bilmek istiyorum.
Özet: Eğer pencereler için daha iyi bir çözüm biliyorsanız, ben linux için test -p /dev/stdin
için yerine kullanabilirsiniz API'leri bilmek istiyorum, ve.
Standart girdi bir dosya tanıtıcısıysa (bir borudan ziyade) 'PeekNamedPipe' çözümünüz başarısız olur. Ayrıca, 'handle' değişkeniniz statik olmamalıdır. Uygulamanız çalışırken tanıtıcı yönlendirilirse, daha sonra kendinizi şaşırtacaksınız. –
@Billy: Bir tanıtıcının rasgele yeniden yönlendirilebileceğini sanmıyorum. Elbette, stdin'i düşündüğünüzü değiştirebilirsin, ama eski sap hala orada. Ama ilk kısım hakkında hemfikirim. – Mehrdad
Lionel B, Linux için http://bytes.com/topic/c/answers/841283-how-make-non-blocking-call-cin adresinde bazı kodlar sağlar - tartışma da okumaya değer. –