2012-02-22 8 views
10

जब मैं fread (सी भाषा) का उपयोग कर एक फ़ाइल से पढ़ने, fread की वापसी मान कभी कभी 0.फ़्रेड और फ़्राइटिट विफलता है? इसे कैसे संभालें?

पुस्तिका के रूप में सुझाव दिया होगा:

fread() और fwrite() की संख्या वापसी आइटम सफलतापूर्वक पढ़ते हैं या लिखित

क्या मुझे इस तरह कोड लिखना है?

int bytes_read; 
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) { 

} 

क्या हमें हमेशा यह जांचना है कि क्या फ़्रेड या फ़्राइट सफल हुआ है या नहीं?

उत्तर

11

नहीं, इस तरह एक पुनः प्रयास लूप कर अगर fread या fwrite रिटर्न रिकॉर्ड की अपेक्षित संख्या की तुलना में कम पढ़ा या लिखित में कोई मतलब नहीं है। ऐसा कहने के लिए, stdio निम्न स्तर read और write संचालन की तरह नहीं है जिसके परिणामस्वरूप "छोटा" पढ़ता है या लिख ​​सकता है।

यदि fread रिकॉर्ड्स की अनुरोधित संख्या से कम लौटाता है, तो आपने या तो ईओएफ या गंभीर पठन त्रुटि को मारा है। आप feof() और ferror() की जांच करके उनके बीच अंतर कर सकते हैं।

इसी प्रकार, यदि fwrite रिकॉर्ड्स की अनुरोधित संख्या से कम लौटाता है, तो आप डिस्क स्थान से बाहर हो जाते हैं या गंभीर लेखन त्रुटि दबाते हैं।

किसी भी मामले में, बफरिंग स्टडीओ के कारण यह जानना असंभव है कि कितना सफलतापूर्वक लिखा गया था, इसलिए यदि आपको कोई त्रुटि त्रुटि आती है, तो आपको आमतौर पर खोए गए फ़ाइल पर विचार करने और पूरे ऑपरेशन को रद्द करने की आवश्यकता होती है।

0

हां।

वापसी मूल्य हमेशा होना चाहिए।

यदि यह नहीं है - तो आपको यह निर्धारित करने के लिए ferror() या feof() का उपयोग करना चाहिए कि आप फ़ाइल के अंत तक पहुंच गए हैं या/या किसी त्रुटि का सामना करना पड़ा है।

त्रुटियों को अनदेखा करना और/या अप्रत्याशित स्थितियां ऐसी चीजें हैं जिनसे अविश्वसनीय उपयोगकर्ताओं पर अविश्वसनीय सॉफ़्टवेयर कम किया जाता है।

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - जंक

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

+1

नहीं, वापसी का मूल्य 'गिनती 'है, न कि' आकार * गिनती ', जब पूरा ऑपरेशन सफल होता है। –

+0

@ आर .. - उह ... मुझे नहीं लगता कि यह सही है। क्या आपको यकीन है? आपके पास ऐसे दस्तावेज़ हैं जो मैंने पोस्ट किए गए असहमत हैं? – Steve

+0

@ आर .. - मुझे पूरा यकीन है कि अगर आप आकार "10" के "5" आइटम का अनुरोध करते हैं तो प्रतिक्रिया "50" नहीं होनी चाहिए "5"। – Steve

4

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

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

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

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

त्रुटि संकेत के बीच अंतर करने के लिए गलत() या feof() फ़ंक्शंस का उपयोग किया जाना चाहिए और त्रुटि को इंगित करने के लिए सेट किया जाएगा। एक अंतहीन फ़ाइल की स्थिति।

0

अगर विफल विफल रहता है, तो यह आम तौर पर असफल रहेगा। आम तौर पर क्योंकि यह फ़ाइल के अंत में मारा जाता है, लेकिन संभवतः किसी अन्य कारण से। यदि यह विफल रहता है, तो आप आमतौर पर फिर से प्रयास नहीं करेंगे।

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