2010-03-28 13 views

उत्तर

14

कोई फ़ंक्शन नहीं है जो आपको वर्तमान पंक्ति देता है। लेकिन आप फ़ाइल की शुरुआत से चार की संख्या के मामले में ऑफ़सेट प्राप्त करने के लिए ftell फ़ंक्शन का उपयोग कर सकते हैं।

+2

वर्णों की संख्या नहीं। बाइट्स की संख्या। सी अवधारणाओं को एक साथ जोड़ता है, यकीन है, लेकिन वे * अलग हैं। –

+10

@ डोनल: उन्होंने कहा 'चार', जो सी कैसे मंत्र 'बाइट' है। –

+1

सावधान। 'ftell' टेक्स्ट-मोड स्ट्रीम के लिए सीधे कुछ अर्थपूर्ण नहीं लौटा सकता है। – jamesdlin

4

वर्तमान लाइन प्राप्त करने के लिए कोई फ़ंक्शन नहीं है; आपको इसे स्वयं ट्रैक करना होगा। कुछ इस तरह:

FILE *file; 
int c, line; 

file = fopen("myfile.txt", "rt"); 
line = 0; /* 1 if you want to call the first line number 1 */ 
while ((c = fgetc(file)) != EOF) { 
    if (c == '\n') 
     ++line; 
    /* 
     ... do stuff ... 
    */ 
} 
3

आप ftell उपयोग करने के लिए आप फ़ाइल के भीतर स्थिति देने के लिए की जरूरत है।

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

यदि आप वर्तमान लाइन स्थिति (मुझे लगता है कि आप का मतलब है कि वर्तमान लाइन का कौन सा चरित्र है), तो आपको स्थिति से पहले लाइन टर्मिनेटर अनुक्रम के बीच वर्णों की संख्या गिननी होगी, और स्थिति ही।

ऐसा करने का सबसे अच्छा तरीका (पीछे की ओर पढ़ने के बाद सुविधाजनक नहीं है) fseek का उपयोग स्थिति से एक समय में एक खंड को बैक अप करने के लिए करना है, एक बफर में खंड को पढ़ें, फिर अंतिम पंक्ति टर्मिनेटर अनुक्रम खोजें उस बिंदु और स्थिति के बीच अंतर की गणना, खंड।

+0

'सबसे अच्छा तरीका' मानता है कि इनपुट के रूप में टर्मिनल या पाइप के बजाए आपके पास एक तलाश करने योग्य डिवाइस है। यह भी मानता है कि आप एक पठनीय फ़ाइल सूचक से निपट रहे हैं - आउटपुट स्ट्रीम में भी 'वर्तमान पंक्ति स्थिति' है। –

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