Estoy escribiendo una utilidad que acepta un nombre de archivo o lee de stdin.Leer del archivo o stdin
Me gustaría saber la forma más robusta/más rápida de comprobar si stdin existe (los datos están siendo canalizados al programa) y si es así leer esos datos en. Si no existe, el procesamiento tomará colocar en el nombre de archivo dado. He intentado utilizar la siguiente prueba para el tamaño de stdin
, pero creo que dado que es una secuencia y no un archivo real, no está funcionando como sospechaba y siempre está imprimiendo -1
. Sé que siempre podría leer el carácter de entrada 1 a la vez cuando! = EOF, pero me gustaría una solución más genérica para poder terminar con un fd o un ARCHIVO * si stdin existe para que el resto del programa funcione sin problemas . También me gustaría saber su tamaño, a la espera de que el flujo haya sido cerrado por el programa anterior.
long getSizeOfInput(FILE *input){
long retvalue = 0;
fseek(input, 0L, SEEK_END);
retvalue = ftell(input);
fseek(input, 0L, SEEK_SET);
return retvalue;
}
int main(int argc, char **argv) {
printf("Size of stdin: %ld\n", getSizeOfInput(stdin));
exit(0);
}
Terminal:
$ echo "hi!" | myprog
Size of stdin: -1
'feof' es complicado porque requiere que hayas hecho un intento previo de leer de la transmisión y haya fallado. (Y si lo hace, también podría verificar el motivo de la falla.) Tampoco es obvio cómo propone usarlo para esta situación. – jamesdlin