Aus Datei oder stdin lesen

Ich schreibe ein Dienstprogramm, das entweder einen Dateinamen akzeptiert oder von stdin liest.

Ich würde gerne die robusteste / schnellste Methode kennen, um zu prüfen, ob stdin vorhanden ist (Daten werden an das Programm weitergeleitet), und wenn ja, diese Daten einzulesen. Wenn es nicht vorhanden ist, findet die Verarbeitung auf dem statt Dateiname angegeben. Ich habe versucht mit dem folgenden Test für die Größe vonstdin aber ich glaube, da es ein Stream und keine tatsächliche Datei ist, funktioniert es nicht wie ich vermutet habe und es wird immer gedruckt-1. Ich weiß, dass ich immer das Eingabe-1-Zeichen gleichzeitig lesen kann! = EOF, aber ich hätte gerne eine allgemeinere Lösung, damit ich entweder eine fd oder eine FILE * bekomme, wenn stdin existiert, damit der Rest des Programms nahtlos funktioniert . Ich würde auch gerne in der Lage sein, seine Größe zu erfahren, bis der Stream vom vorherigen Programm geschlossen wurde.

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

Antworten auf die Frage(12)

Ihre Antwort auf die Frage