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