2010-03-23 17 views
6

निम्नलिखित कोड आउटपुट की तलाश "अवैध तलाश" का कारण बनता है:ftell (stdin) अवैध त्रुटि

#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 के साथ हल करने की कोशिश कर रहे हैं? –

उत्तर

12

फिफोज़ खोजने योग्य नहीं हैं। वे बस एक बफर हैं। एक बार डेटा एक फीफो बफर से read() रहा है, इसे कभी भी पुनर्प्राप्त नहीं किया जा सकता है।

ध्यान दें कि अगर आप अपने कार्यक्रम भागा:

./a.out < script 

तो मानक इनपुट एक फ़ाइल और होगा नहीं एक फीफो, तो ftell() तो आप क्या उम्मीद करेंगे।

+2

+1 उदाहरण के लिए +1 जो 'बिल्ली फ़ाइल |/a.out' और './a.out

+0

@ आर .. क्या अंतर है? – Calmarius

+0

@ कलमियस: बिल्ली एफ | एक्स एक फाइल को एक फीफो में कॉपी करने के लिए एक अलग प्रक्रिया (और शायद एक अलग सीपीयू) का उपयोग करता है। प्रक्रिया x द्वारा फीफो पढ़ा जा रहा है। यदि एक्स पढ़ने के अलावा अन्य चीजें करता है() यह फ़ाइल को स्वयं पढ़ता है तो यह तेज़ हो सकता है। x geocar

संबंधित मुद्दे