2015-02-08 8 views
7

में वापसी मूल्य मैं fread()<stdio.h> में फ़ंक्शन कैसे काम करता हूं और मैं इस फ़ंक्शन के वापसी मूल्य के बारे में उलझन में हूं। आदमी पन्नों में यह कहता हैफ्रेड() सी

वापसी मान
सफलता पर, fread() और fwrite() लौट आइटम की संख्या या लिखित पढ़ें। यह संख्या केवल स्थानांतरित बाइट्स की संख्या के बराबर होती है जब आकार 1 होता है। यदि कोई त्रुटि होती है, या फ़ाइल का अंत तक पहुंच गया है, तो वापसी मान एक छोटी वस्तु गणना (या शून्य) है।

fread() अंत फ़ाइल और त्रुटि बीच भेद नहीं करता, और कॉल निर्धारित करने के लिए जो हुआ feof(3) और ferror(3) उपयोग करना चाहिए।

क्या कोई मुझे इस बारे में बता सकता है कि number of items read or written इस संदर्भ में क्या है। क्या कोई मुझे कुछ उदाहरण वापसी मान और उनके अर्थ प्रदान कर सकता है?

+2

'fread()' 'पढ़ता एन * K' बाइट्स, जहां' n' प्रत्येक तत्व में बाइट्स की संख्या है, और कुल 'के' तत्वों में पढ़ा जाएगा। आदर्श रूप में, यदि कोई त्रुटि नहीं होती है, तो 'के' वापस कर दिया जाएगा। यदि कोई त्रुटि या फ़ाइल की स्थिति समाप्त होती है, तो 'K' तत्वों से कम पढ़ा जा सकता है, इस मामले में 'के' से छोटा नंबर वापस कर दिया जाएगा। –

+0

संबंधित: http://stackoverflow.com/q/8589425/827263 –

उत्तर

11

fread() हुई प्रदान की आईओ धारा (FILE* stream) से एक निर्धारित आकार की मदों की एक गिनती पढ़ा जाएगा होना चाहिए। यह आइटमों की संख्या स्ट्रीम से सफलतापूर्वक पढ़ता है। यदि यह आइटम की अनुरोधित संख्या से कम संख्या देता है, तो आईओ स्ट्रीम को खाली माना जा सकता है (या अन्यथा टूटा हुआ)।

बाइट की संख्या पढ़ें मदों की संख्या के बराबर होगा सफलतापूर्वक बार प्रदान की आकार वस्तुओं की पढ़ें।

निम्नलिखित कार्यक्रम पर विचार करें।

#include <stdio.h> 

int main() { 
    char buf[8]; 
    size_t ret = fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), stdin); 
    printf("read %zu bytes\n", ret*sizeof(*buf)); 
    return 0; 
} 

जब हम इस कार्यक्रम को चलाते हैं, तो प्रदान की गई इनपुट की मात्रा के आधार पर, विभिन्न परिणामों को देखा जा सकता है।

हम कोई इनपुट प्रदान नहीं कर सकते हैं। आईओ स्ट्रीम (ईओएफ) के साथ शुरू करने के लिए खाली हो जाएगा। वापसी मूल्य शून्य होगा। कोई आइटम नहीं पढ़ा गया है। शून्य वापस आ गया है।

$ : | ./a.out 
read 0 bytes 

हम अनुरोध के रूप में कम इनपुट प्रदान करते हैं। ईओएफ का सामना करने से पहले कुछ आइटम पढ़े जाएंगे। पढ़ी गई वस्तुओं की संख्या वापस कर दी गई है। कोई और वस्तु उपलब्ध नहीं है। उसके बाद धारा खाली है।

$ echo "Hello" | ./a.out 
read 6 bytes 

हम अनुरोध के अनुसार बराबर या अधिक इनपुट प्रदान करते हैं। अनुरोध किए गए आइटमों की संख्या वापस कर दी जाएगी। अधिक आइटम उपलब्ध हो सकते हैं।

$ echo "Hello World" | ./a.out 
read 8 bytes 

संबंधित पढ़ने:

जब वहाँ धारा में कम बाइट से एक आइटम consitute हैं, बाइट्स की संख्या धारा से भस्म लेकिन अधिक से अधिक हो सकता है बाइट्स की संख्या से ऊपर के सूत्र द्वारा गणना के अनुसार पढ़ें। (और यह करने के लिए टिप्पणी) ऊपर लिंक सवाल का जवाब यह मैं इस मामले में विशेष रूप से व्यावहारिक लगता है:

+0

आपका प्रोग्राम अधिक उपयोगी होगा (प्रश्न के संबंध में) यदि यह फ़ाइल के एक फ्रेड() को 7 बाइट लंबा और आकार 1, 2 और 4 पर सेट किया गया है। –

3

fread() के लिए वाक्यविन्यास

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream); 

जिसका अर्थ है,

समारोह fread() पढ़ता डेटा की nmemb तत्वों, प्रत्येक size बाइट्स लंबे, धारा से stream द्वारा की ओर इशारा किया है, भंडारण उन्हें ptr द्वारा दिए गए स्थान पर।

तो, बाइट पढ़ने की कुल संख्या nmemb * size होगी।

अब,

सफलता पर

, fread() और fwrite कह कर() लौट आइटम की संख्या को पढ़ने या लिखा। यह संख्या केवल स्थानांतरित बाइट्स की संख्या के बराबर होती है जब आकार 1.

इसका मतलब है कि, वापसी मान nmemb बराबर होगा जब size1.

तर्क एक ही है, fwrite() भी होने की स्थिति में है।


संपादित

उदाहरण के लिए

,

fread(readbuf, sizeof(int), 5 , stdin); 

तरह fread() करने के लिए एक पूरी तरह से सफल कॉल 5 वापस आ जाएगी, जबकि यह sizeof(int) * 5 बाइट्स पढ़ा जाएगा। अगर हम मानते हैं कि sizeof(int)4 है, तो कुल बाइट्स 5 * 4 या 20 होगा।आप देख सकते हैं, यहाँ, आइटम्स की संख्या को पढ़ने या लिखाहै नहीं बराबर बाइट्स की संख्या को हस्तांतरित

OTOH,

fread(readbuf, sizeof(char), 5 , stdin); 

तरह fread() के लिए एक और पूरी तरह से सफल कॉल भी 5 वापस आ जाएगी, जबकि यह sizeof(char) * 5 बाइट्स, जैसे कि, 5 बाइट्स पढ़ा जाएगा। इस मामले में, sizeof(char) रूप 1 यहाँ है, इसलिए,, आइटम्स की संख्या को पढ़ने या लिखाबराबर है बाइट्स की संख्या हस्तांतरित। यानी, 5

+0

आकार के समय क्या होता है! = 1 यद्यपि? मैं कोड के माध्यम से पढ़ रहा हूं जो इस फ़ंक्शन के लिए संरचना के आकार को पास करता है। –

+0

@ जोर्डन कैंप मैंने अपडेट किया है। आशा है कि अब यह स्पष्ट है। :-) –

0

पढ़ने या लिखे गए आइटमों की संख्या का अर्थ है फ़ाइल स्ट्रीम से बफर में आकार_टी आकार की वस्तुओं की संख्या। जब आप FILE से बफर तक एन बाइट्स को पढ़ना चाहते हैं तो उसे एन वापस करना चाहिए और आप इसे एक चर में संग्रहीत कर सकते हैं यह देखने के लिए कि क्या यह वास्तव में सभी बाइट्स को पढ़ता है या नहीं। यदि यह वापसी मूल्य! = एन, इसका मतलब है कि एक त्रुटि हुई। उदाहरण के लिए यदि आपके पास एक फ़ाइल है जिसमें 4 32 बिट इन्ट्स हैं, तो आप इसे element_read = fread (buf, sizeof (int), 4, fp) के साथ पढ़ सकते हैं; bytes_read फिर 4 यदि कोई त्रुटि

+0

इसका मतलब बाइट्स की संख्या नहीं है, जब तक कि ब्लॉक आकार 1 बाइट नहीं दिया जाता है। – hyde

+0

अच्छी तरह से यह वास्तव में size_t आकार के तत्वों की संख्या है, मेरा खराब – BsD

+1

कृपया या तो इस उत्तर को ठीक या हटाएं - इसलिए हमें इसे कम करने की आवश्यकता नहीं है और फिर इसे हटाने के लिए ध्वजांकित करें। –

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