2012-01-18 10 views
5

सी में fgets और fscanf से संबंधित एक प्रश्न है। इन दोनों के बीच क्या अंतर है?fgets और fscanf के बीच अंतर?

char str[10]; 
while(fgets(str,10,ptr)) 
{ 
counter++; 
... 

और दूसरा उदाहरण: उदाहरण के लिए:

char str[10]; 
while(fscanf(ptr,"%s",str)) 
{ 
counter++; 
... 

जब जो तार जो उदाहरण के लिए, एक खाली जगह से अलग होते हैं शामिल एक पाठ फ़ाइल होने: AB1234 AC5423 AS1433। पहले उदाहरण में जबकि लूप में "काउंटर" दूसरे उदाहरण के समान उत्पादन नहीं देगा। Fgets फ़ंक्शन में "10" को बदलते समय काउंटर हमेशा अलग-अलग परिणाम देगा। इसका कारण क्या है? क्या कोई यह भी समझा सकता है कि fscanf वास्तव में क्या करता है, लूप के दौरान प्रत्येक में स्ट्रिंग कितनी देर तक है?

उत्तर

5

फ़ंक्शन fgets एक नई लाइन तक पढ़ा जाता है (और इसे स्टोर भी करता है)। fscanf%s विनिर्देशक के साथ किसी भी रिक्त स्थान तक पढ़कर उस पर दुकान नहीं है ...

एक तरफ ध्यान दें के रूप में, आप scanf में बफर के आकार को निर्दिष्ट नहीं कर रहे हैं और यह असुरक्षित है। आज़माएं:

fscanf(ptr, "%9s", str) 
+0

आपके उत्तर के लिए धन्यवाद, क्या यह fputs और fprintf के लिए भी समान है? या उनके बीच क्या अंतर है? – phpheini

+0

नहीं, वे अलग हैं। उदाहरण के लिए '% s' printf में रिक्त स्थान पर नहीं रुकता है। मैनुअल पढ़ें। – cnicutar

3

fgets एक नई लाइन पर पढ़ता है। fscanf केवल व्हाइटस्पेस को पढ़ता है।

1

fgets पूरी लाइन पढ़ें। fscanf%s के साथ एक स्ट्रिंग पढ़ें, अंतरिक्ष से अलग (या \ n, \ t, आदि ...)। वैसे भी, आपको तब तक उनका उपयोग नहीं करना चाहिए जब तक कि आप सुनिश्चित न करें कि आपके द्वारा पढ़ी जाने वाली सरणी इनपुट को शामिल करने के लिए पर्याप्त है। आपने When changing the "10" in the fgets function the counter will always give different results. लिखा था नोट करें कि fgets और scanf को नहीं पता कि कितने बाइट पढ़ने के लिए। आपको उन्हें बताना चाहिए। "10" को बदलकर बस इन कार्यों को लिखने वाले बफर को बढ़ाएं।

1

आपके उदाहरण में, fgets इनपुट स्ट्रीम से अधिकतम 9 वर्ण तक पढ़ेगा और उन्हें 0 टर्मिनेटर के साथ str पर सहेज देगा। यह अग्रणी व्हाइटस्पेस को नहीं छोड़ेगा। अगर यह एक नई लाइन (जिसे str में सहेजा जाएगा) या ईओएफ अधिकतम वर्णों से पहले यह बंद हो जाएगा तो यह रुक जाएगा।

%s रूपांतरण विनिर्देशक किसी भी प्रमुख खाली स्थान के साथ छोड़ देगा fscanf, तो सभी गैर-सफ़ेद वर्णों को पढ़ने, उन्हें str द्वारा एक 0 टर्मिनेटर का पालन करने के लिए बचत। यह अगले व्हाइटस्पेस चरित्र या ईओएफ पर पढ़ना बंद कर देगा। स्पष्ट फ़ील्ड चौड़ाई के बिना, यह स्ट्रीम में मौजूद कई गैर-व्हाइटस्पेस वर्णों को पढ़ेगा, संभावित रूप से लक्ष्य बफर को ओवरराउन कर देगा।

तो, कल्पना करें कि इनपुट स्ट्रीम इस तरह दिखता है: "\t abcdef\n<EOF>"। यदि आपने इसे पढ़ने के लिए fgets का उपयोग किया है, तो str में "\t abcdef\n\0" होगा। यदि आपने fscanf का उपयोग किया है, str में "abcdef\0" हो सकता है (जहां \0 0 टर्मिनेटर इंगित करता है)।

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