Читать из файла или стандартного ввода
Я пишу утилиту, которая принимает либо имя файла, либо читает из стандартного ввода.
Я хотел бы знать, какой самый надежный / быстрый способ проверить, существует ли stdin (данные передаются в программу) и, если это так, считывает эти данные. Если он не существует, обработка будет выполняться по имени файла дано. Я попытался использовать следующий тест для размераstdin
но я верю, что поскольку это поток, а не фактический файл, он не работает, как я подозревал, и всегда печатает-1
, Я знаю, что всегда мог прочитать вводимые 1 символ за раз, в то время как! = EOF, но я бы хотел более общее решение, чтобы я мог получить либо fd, либо FILE *, если stdin существует, поэтому остальная часть программы будет работать без проблем. , Я также хотел бы иметь возможность узнать его размер, пока поток не был закрыт предыдущей программой.
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);
}
Терминал:
$ echo "hi!" | myprog
Size of stdin: -1