2010-03-23 49 views
6

下面的代碼輸出「非法尋求」:FTELL(標準輸入)會導致非法謀取錯誤

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

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

這當我運行出現「貓劇本| ./a.out」,以及時我就跑「 ./a.out」。當然,問題在於ftell。我的問題是:爲什麼會發生?我會認爲stdin可以被尋求。 fseek也會導致相同的錯誤。如果stdin不可搜索,有什麼辦法可以做同樣的事情嗎?

謝謝你的回覆。

+1

你真的想用fseek解決什麼問題? – 2010-03-23 18:33:52

回答

12

Fifos是不可搜索的。它們只是一個緩衝區。一旦數據從fifo緩衝區獲得read(),它永遠不會被檢索到。

請注意,如果你運行你的程序:

./a.out < script 

那麼標準輸入將是一個文件而不是FIFO,所以ftell()接下來將做你的期望。

+2

+1表示顯示'cat file | ./a.out'和'./a.out 2010-08-07 15:09:53

+0

@R ..有什麼區別? – Calmarius 2013-09-22 19:37:08

+0

@Calmarius:cat f | x使用一個單獨的進程(也可能是一個單獨的cpu)將文件複製到fifo中。 fifo被進程x讀取。如果x執行read()以外的操作,則可能比讀取文件本身更快。 x geocar 2013-09-23 23:40:36