Básicamente quiero probar si stdin tiene entrada (como si hace eco y lo canaliza). He encontrado soluciones que funcionan, pero son feas, y me gusta que mis soluciones estén limpias.Pruebe si stdin tiene entrada para C++ (Windows y/o Linux)
En Linux utilizo este:
bool StdinOpen() {
FILE* handle = popen("test -p /dev/stdin", "r");
return pclose(handle) == 0;
}
Sé que debo añadir más control de errores, pero es el punto.
En las ventanas que utilizan este:
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
que está muy bien para Linux, pero me gustaría saber cuáles son las API equivalentes que puedo llamar sin necesidad de utilizar un tubo (como por test -f $file
que haces fopen($file, "r") != NULL
). Tengo una idea de que podría open("/dev/stdin", "r")
y hacer lo mismo, pero quiero saber la mejor manera de hacerlo.
Resumen: Quiero saber las API podría utilizar para sustituir a test -p /dev/stdin
para Linux, y, si se sabe una mejor solución para las ventanas.
Su solución 'PeekNamedPipe' falla si la entrada estándar es un identificador de archivo (en lugar de una pipa). Además, su variable 'handle' no debe ser estática. Si el mango se redirecciona mientras se ejecuta tu aplicación, te sorprenderás más tarde. –
@Billy: No creo que se pueda redirigir aleatoriamente un identificador. Claro, puedes cambiar lo que consideras que es stdin, pero el viejo mango aún está allí. Pero estoy de acuerdo con la primera parte. – Mehrdad
Lionel B proporciona algún código para Linux en http://bytes.com/topic/c/answers/841283-how-make-non-blocking-call-cin; la discusión también vale la pena leerla. –