Sto scrivendo un'utilità che accetta un nome file o legge da stdin.Lettura da file o stdin
Vorrei sapere il metodo più robusto/più veloce per verificare se esiste stdin (i dati vengono inviati al programma) e in tal caso leggere tali dati. Se non esiste, l'elaborazione richiederà posiziona sul nome file indicato. Ho provato a utilizzare il seguente test per la dimensione di stdin
ma credo poiché si tratta di un flusso e non di un file effettivo, non funziona come sospettavo sarebbe e stampa sempre -1
. So che potrei sempre leggere il carattere di input 1 alla volta mentre! = EOF ma vorrei una soluzione più generica in modo che potessi finire con un fd o un FILE * se stdin esiste così il resto del programma funzionerà perfettamente . Mi piacerebbe anche essere in grado di conoscere le sue dimensioni, in attesa che il flusso sia stato chiuso dal programma precedente.
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' è difficile in quanto richiede di aver fatto un precedente tentativo di leggere dallo stream e non è riuscito. (E se lo fai, potresti anche controllare il motivo del fallimento.) Non è ovvio come tu lo proponga di usarlo anche per questa situazione. – jamesdlin