2011-11-17 17 views
5

तो, मैं (fgets के लिए एक रास्ता) सी में एक पाठ फ़ाइल में एक विशिष्ट लाइन, एक और अधिक स्थायी बफर में लाइन की सामग्री की प्रतिलिपि करने के लिए खोजने की कोशिश कर रहा हूँ:सी में फ़ाइल से एक विशिष्ट रेखा fgets() कैसे करें?

अनिवार्य रूप से, मैं सोच रहा था अगर वहाँ कि निम्नलिखित कोड को कुछ इसी तरह के बिना ऐसा करने के लिए एक तरीका था:

FILE *fp; 
fp = fopen(filename, "r"); 

char line[256]; 
char * buffer; 
int targetline = 10; 
while(targetline > 0) 
{ 
    fgets(line, 256, fp) 
} 

buffer =(char*)malloc(sizeof(char) * strlen(line)); 
strcpy(buffer, line); 
तो मूल रूप से

मैं फ़ाइल n-1 बार सिर्फ वें लाइन को पाने के लिए के माध्यम से पुनरावृति नहीं करना चाहता ... यह सिर्फ नहीं करता है बहुत कुशल प्रतीत नहीं होता है (और, यह होमवर्क है, मुझे 100% हाहा प्राप्त करने की आवश्यकता है)।

किसी भी मदद की सराहना की जाएगी।

+0

यदि आपकी लाइनों में मनमानी लंबाई हो सकती है, तो आप निरंतर समय में 'n' लाइनों को छोड़ने की अपेक्षा कैसे करते हैं? –

+0

एकमात्र वास्तविक विकल्प यह है कि प्रत्येक पंक्ति कहां शुरू होती है (एक बार फ़ाइल को पढ़ें, इंडेक्स बनाएं, फिर आप इसे तब तक लाइन तक ढूंढने के लिए उपयोग करें जब तक फ़ाइल बदलती न हो)। यह भी ध्यान रखें कि आपके 'malloc' को एनयूएल टर्मिनेटर के लिए स्पेस छोड़ने के लिए 1 जोड़ने की आवश्यकता है। –

+0

पाठ फ़ाइलों को संग्रहीत करने के लिए कुछ तंत्र दृढ़ता से एनएच लाइन तक निरंतर समय तक पहुंचने का तरीका प्रदान कर सकते हैं, या कम से कम रैखिक समय से बेहतर हो सकते हैं। संभवतः वीएमएस पर इस्तेमाल किए गए कुछ फ़ाइल प्रारूप यह करते हैं। लेकिन सी मानक लाइब्रेरी ऐसी किसी भी तंत्र का पर्दाफाश नहीं करती है, और अधिकांश ऑपरेटिंग सिस्टम पर यह सादे पाठ फ़ाइलों के लिए भी संभव नहीं है, जब तक कि आप स्वयं एक इंडेक्स नहीं बनाते। तो यह एक अनुचित सवाल नहीं है - लेकिन जवाब नहीं है। –

उत्तर

7

जब तक आप फ़ाइल के बारे में कुछ और नहीं जानते हैं, तो आप यादृच्छिक रूप से विशिष्ट लाइनों तक नहीं पहुंच सकते हैं। लाइनों के अंत पात्रों की उपस्थिति से नई लाइनों को सीमित किया जाता है और वे सामान्य रूप से कहीं भी हो सकते हैं। टेक्स्ट फाइल मानचित्र या अनुक्रमणिका के साथ नहीं आती है जो आपको n th लाइन पर जाने की अनुमति देगी।

यदि आप जानते थे कि, फ़ाइल में प्रत्येक पंक्ति एक ही लंबाई थी, तो आप किसी विशेष पंक्ति पर कूदने के लिए यादृच्छिक पहुंच का उपयोग कर सकते हैं। इस प्रकार के अतिरिक्त ज्ञान के बिना, जब तक आप अपनी वांछित रेखा तक नहीं पहुंच जाते, तब तक पूरी फ़ाइल के माध्यम से फिर से प्रयास करने के अलावा आपके पास कोई विकल्प नहीं है।

3

मुझे डर है, फ़ाइल में एनटी लाइन पाने का कोई और तरीका नहीं है। आपको जाना है फ़ाइल के भीतर कोई यादृच्छिक acces नहीं है।

8

यदि आप प्रत्येक पंक्ति की लंबाई जानते हैं, तो आप जिस लाइन को चाहते हैं उसे छोड़ने के लिए आप fseek का उपयोग कर सकते हैं।

अन्यथा, आपको सभी लाइनों के माध्यम से जाना होगा।

2

यदि आप टेक्स्ट फ़ाइल से एनटी लाइन प्राप्त करना चाहते हैं, तो आपको इससे पहले एन-1 लाइनें पढ़नी होंगी। यह अनुक्रमिक फ़ाइल की प्रकृति है। जब तक आप नहीं जानते कि आपकी सभी लाइनें एक ही लंबाई हैं, तो किसी विशेष पंक्ति की शुरुआत के लिए भरोसेमंद स्थिति का कोई तरीका नहीं है।

5

सबसे पहले, अपनी लाइन

buffer =(char*)malloc(sizeof(char) * strlen(line)); 

बेहतर रूप में लिखा है:

buffer = malloc(strlen(line) + 1); 

+ 1 समाप्त '\0' चरित्र के लिए कमरे उपलब्ध कराने की जरूरत है; strlen() इसके लिए खाता नहीं है। सी में malloc() के परिणाम कास्टिंग आवश्यक नहीं है, और कुछ मामलों में त्रुटियों को मुखौटा कर सकते हैं। sizeof(char) परिभाषा के अनुसार 1 है, इसलिए इसकी आवश्यकता नहीं है।

और आपने targetline का मान कभी नहीं बदला है, इसलिए आपका लूप कभी समाप्त नहीं होगा।

लेकिन आपके प्रश्न के उत्तर में, यदि आपके पास एक टेक्स्ट फ़ाइल है और आप इसकी एनएच लाइन पढ़ना चाहते हैं, तो आपको इसे प्राप्त करने के लिए पहली एन -1 लाइनों को पढ़ना और छोड़ना होगा। (एक अलग इंडेक्स स्थापित करना संभव है, लेकिन इंडेक्स बनाने के लिए फ़ाइल के माध्यम से किसी भी तरह से पढ़ने की आवश्यकता है, और फ़ाइल परिवर्तन के रूप में इंडेक्स को चालू रखना एक मुश्किल समस्या है, शायद अब आप जो कर रहे हैं उससे परे है। और यह विशेष रूप से आवश्यक नहीं है; फ़ाइल से 10 लाइनों को पढ़ने का समय ध्यान देने योग्य नहीं होगा।)

+1

@ डेविड: संपादन के लिए धन्यवाद। –

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