Читать из файла или стандартного ввода

Я пишу утилиту, которая принимает либо имя файла, либо читает из стандартного ввода.

Я хотел бы знать, какой самый надежный / быстрый способ проверить, существует ли 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

Ответы на вопрос(6)

Ваш ответ на вопрос