मुझे लंबाई के बारे में धारणा किए बिना पाठ की एक पंक्ति (एक नई लाइन द्वारा समाप्त) पढ़ने की जरूरत है। इसलिए मैं अब संभावनाओं को सामना करना पड़ता है:सी fgets बनाम fgetc पढ़ने के लिए
- उपयोग
fgets
और हर बार की जाँच करता है, तो अंतिम वर्ण कोई नई पंक्ति है और लगातार एक बफर - को संलग्न
fgetc
और कभी-कभीrealloc
बफर
अंतर्ज्ञान मुझे fgetc
संस्करण धीमा हो सकता है, लेकिन फिर मैं नहीं देखता कि fgets
प्रत्येक चरित्र की जांच किए बिना इसे कैसे कर सकता है (मेरा अंतर्ज्ञान हमेशा अच्छा नहीं होता है)। रेखाएं काफी बड़ी हैं इसलिए प्रदर्शन महत्वपूर्ण है।
मैं प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष को जानना चाहता हूं। पहले ही, आपका बहुत धन्यवाद।
'fgets' के साथ' गेटलाइन 'फ़ंक्शन को कार्यान्वित करते समय एक सीमा यह है कि एक ही समय में एक न्यूलाइन वर्ण के साथ समाप्त नहीं होने वाली नल बाइट्स ** और ** फ़ाइलों को संभालना असंभव है। यदि 'fgets' एक ईओएफ स्थिति का सामना करता है और बिना किसी न्यूलाइन चरित्र के लौटाता है, तो आप केवल यह मान सकते हैं कि स्ट्रिंग पहले नल बाइट पर समाप्त होती है। (अन्य मामलों में, आप यह जानने के लिए 'strchr (buf,' \ n ')' कर सकते हैं कि रीडिंग रोका गया है या यदि कोई '\ n'' नहीं है, तो आपको' realloc' 'की आवश्यकता है।) – mk12
यदि फ़ाइल में शून्य बाइट्स हैं, यह एक टेक्स्ट फ़ाइल नहीं है। (यह एक विस्तृत चरित्र फ़ाइल हो सकती है, लेकिन फिर आपको इसे पढ़ने के लिए विस्तृत वर्ण I/O फ़ंक्शंस का उपयोग करने की आवश्यकता है।) और 'fgets()' को उन फ़ाइलों को संभालने के लिए डिज़ाइन नहीं किया गया है जिनमें शून्य बाइट्स हैं - ठीक है क्योंकि यह कोई नहीं देता है विश्वसनीय संकेत यह कितने बाइट्स पढ़ता है। यदि आपकी डेटा फ़ाइल में शून्य बाइट्स हैं, तो आपको इसे पढ़ने के लिए 'fgets() 'का उपयोग नहीं करना चाहिए। –
http://linux.die.net/man/3/getline (रिटर्न वैल्यू सेक्शन) ऐसा लगता है कि यह एक उपयोगी बात हो सकती है। यही वह जगह है जहां मुझे विचार आया, हालांकि मुझे लगता है कि मैं आपसे सहमत हूं। अब जब मैं इसके बारे में सोचता हूं, शायद यह केवल वहां उल्लेख किया गया है क्योंकि यह '\ n'' के अलावा एक डिलीमीटर का उपयोग करते समय उपयोगी हो सकता है। – mk12