2010-03-23 8 views
6

Der folgende Code gibt "Illegal suchen" suchen:ftell (stdin) verursacht illegale Fehler

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 

int main() { 
    errno = 0; 
    getchar(); 
    getchar(); 
    getchar(); 
    ftell(stdin); 
    printf("%s\n", strerror(errno)); 
} 

Dies geschieht, wenn ich laufen "cat Skript | ./a.out" sowie, wenn ich nur laufen " ./a.out ". Das Problem ist natürlich bei ftell. Meine Frage ist: Warum passiert das? Ich würde denken, dass Stddin gesucht werden kann. fseek verursacht auch den gleichen Fehler. Wenn stdin nicht suchbar ist, gibt es einen Weg, wie ich das gleiche tun kann?

Vielen Dank für Ihre Antworten.

+1

Was ist das Problem, das Sie eigentlich mit fseek lösen möchten? –

Antwort

12

Fifos sind nicht suchbar. Sie sind einfach ein Puffer. Sobald Daten aus einem FIFO-Puffer read() wurden, kann es nie abgerufen werden.

Beachten Sie, wenn Sie Ihr Programm lautete:

./a.out < script 

dann Standardeingabe eine Datei wäre und ein nicht Fifo, so ftell() wird dann das tun, was Sie erwarten.

+2

+1 für ein Beispiel, das den Unterschied zwischen 'cat file |./A.out' und' ./a.out

+0

@R .. Was ist der Unterschied? – Calmarius

+0

@Calmarius: cat f | x verwendet einen separaten Prozess (und möglicherweise eine separate CPU), um eine Datei in einen Fifo zu kopieren. Der Fifo wird vom Prozess x gelesen. Wenn x etwas anderes als read() tut, kann dies schneller sein, als wenn es die Datei selbst liest. x geocar