हम जानते हैं कि stdin
डिफ़ॉल्ट रूप से, एक buffered इनपुट है; इस बात का सबूत है, तंत्र stdin
पर "डेटा छोड़" में से किसी के उपयोग में है इस तरह के रूप में scanf()
:क्या स्टडीन बफर पर नजर डालने के लिए वैसे भी है?
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
./a.out
है
हैलो
नमस्ते, और बाईं 10
10
निश्चित रूप से न्यू लाइन किया जा रहा है ...
मैं हमेशा से उत्सुक किया गया है, वहाँ वैसे भी "झांकना" करने के लिए है stdin
बफर जो कुछ भी वहां रह सकता है उसे हटाए बिना?
संपादित
एक बेहतर उदाहरण हो सकता है:
scanf("%9[^.]", c);
"at.ct" की एक इनपुट के साथ
, अब मैं "डाटा" (ct\n
) stdin
पर छोड़ दिया, न सिर्फ एक नई पंक्ति की है।
आप peeking के बाद 'ungetc() 'कर सकते हैं। काफी है? –
@DanielFischer - मुझे लगता है कि यह बुरा नहीं है ... क्या होगा अगर वर्णों का पूरा समूह छोड़ा गया हो? क्या मैं stdin पर छोड़े गए डेटा की लंबाई जान सकता हूं? या मैं एक अक्षर फिर से ungetc() 'सकता था? – Mike
"पुशबैक का एक चरित्र गारंटीकृत है। अगर उस स्ट्रीम पर 'ungetc' फ़ंक्शन को एक ही स्ट्रीम पर कई बार बार-बार पढ़ने या फ़ाइल पोजिशनिंग ऑपरेशन के बिना बुलाया जाता है, तो ऑपरेशन विफल हो सकता है।" आमतौर पर, आप एक से अधिक 'ungetc' कर सकते हैं, लेकिन केवल एक की गारंटी है। –