2010-01-26 16 views

उत्तर

5

आप लाइन में प्रत्येक वर्ण के माध्यम से पुनरावृत्त कर सकते हैं और अंतराल ('\n') का सामना करना पड़ता है जब तक काउंटर को बढ़ाना जारी रखें। फ़ाइल को टेक्स्ट मोड ("r") में खोलना सुनिश्चित करें और बाइनरी मोड ("rb") नहीं। अन्यथा स्ट्रीम स्वचालित रूप से '\n' वर्णों में अलग-अलग प्लेटफॉर्म के लाइन समापन अनुक्रमों को परिवर्तित नहीं करेगा।

यहाँ एक उदाहरण है:

int charcount(FILE *const fin) 
{ 
    int c, count; 

    count = 0; 
    for(;;) 
    { 
     c = fgetc(fin); 
     if(c == EOF || c == '\n') 
      break; 
     ++count; 
    } 

    return count; 
} 

यहाँ ऊपर समारोह का परीक्षण करने के लिए एक उदाहरण कार्यक्रम है:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE *fin; 

    fin = fopen("test.txt", "r"); 
    if(fin == NULL) 
     return 1; 

    printf("Character count: %d.\n", charcount(fin)); 

    fclose(fin); 
    return 0; 
} 
+0

आपको नई लाइन के सूचकांक प्राप्त करने के लिए वास्तव में चरित्र-दर-चरित्र जाने की आवश्यकता नहीं है। आप '\ n' की अनुक्रमणिका को खोजने के लिए strcspn() का उपयोग कर सकते हैं। (Http://stackoverflow.com/questions/4824/string-indexof-function-in-c देखें) – David

+0

strcspn() और strspn() फ़ाइलों से नहीं पढ़ते हैं। उनका उपयोग करने के लिए, आपको पूरी लाइन को एक स्ट्रिंग में पढ़ना होगा और फिर '\ n' वर्ण खोजने के लिए इसके माध्यम से पुन: पुन: पुन: प्रयास करना होगा। यह कम कुशल है। बेशक, यह इस बात पर निर्भर करता है कि एमआरपी अपनी फाइल आईओ कोड कैसे कर रहा है। – Sam

+0

हां, यह कोड मदद करता है हालांकि मुझे कुछ जगहों को बदलना पड़ा। लेकिन मुझे बेहतर समझ है कि यह कैसे काम करता है .. धन्यवाद – MRP

2

लाइन द्वारा फ़ाइल लाइन पढ़ने के संबंध में, fgets देखें।

char *fgets(char *restrict s, int n, FILE *restrict stream); 

fgets() फ़ंक्शन धारा से में सरणी द्वारा की ओर इशारा किया है, जब तक n-1 बाइट्स पढ़ रहे हैं बाइट्स पढ़ा जाएगा, या एक पढ़ सकते हैं और रों को स्थानांतरित कर रहा है, या एक अंत में फ़ाइल की स्थिति सामने आई है। स्ट्रिंग तब एक शून्य बाइट से समाप्त होती है।

यहां एकमात्र समस्या हो सकती है यदि आप अपनी फ़ाइल में अधिकतम पंक्ति आकार की गारंटी नहीं दे सकते हैं। यदि ऐसा है, तो आप एक पंक्ति फ़ीड देखने तक वर्णों पर फिर से सक्रिय कर सकते हैं।

पंक्ति के अंत के बारे में:

लघु जवाब: \n न्यू लाइन चरित्र (यह भी एक लाइन फ़ीड कहा जाता है) है।

लांग जवाब है, विकिपीडिया से:

सिस्टम ASCII या एक संगत वर्ण सेट का उपयोग करें या तो वामो (लाइन फ़ीड, 0x0A, 10 दशमलव में) या सीआर (कैरिज रिटर्न, 0x0D, 13 के आधार पर दशमलव में) व्यक्तिगत रूप से, या सीआर के बाद एलएफ (सीआर + एलएफ, 0x0D 0x0A); सीआर + एलएफ सम्मेलन के ऐतिहासिक कारण के लिए नीचे देखें। ये अक्षर प्रिंटर आदेशों पर आधारित होते हैं: लाइन फ़ीड संकेत दिया है कि कागज में से एक लाइन प्रिंटर से बाहर फ़ीड चाहिए, और एक गाड़ी वापसी संकेत दिया कि प्रिंटर गाड़ी वर्तमान पंक्ति के शुरुआत में वापस आने चाहिए।

* LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others 
* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS 
* CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 

लेकिन जब से तुम एक प्रतिनिधित्व केवल गाड़ी वापसी का उपयोग करता है, ठीक किया जाना चाहिए एक लाइन फ़ीड की तलाश के साथ काम करने की संभावना नहीं हैं।

+0

सू आप एक पाश कर सकते हैं जब तक चार = \ N – MRP

+0

राइट [15 वर्ण] में – danben

+0

फ़ाइल *; = fopen ("numbers.txt", "r") में; यदि (इन! = एनयूएलएल) \t { क्या मैं एक भूलभुलैया का उपयोग करता हूं \ n? – MRP

1

\n सी में न्यू लाइन चरित्र इस तरह के सी # के रूप में अन्य भाषाओं, में है, तो आप प्लेटफ़ॉर्म कठिनाइयों को दूर करने के लिए C# के Environment.EndLine जैसे कुछ का उपयोग कर सकते हैं।

यदि आप पहले से ही जानते हैं कि आपकी स्ट्रिंग एक पंक्ति है (चलिए इसे लाइन कहते हैं), इसमें वर्णों की संख्या प्राप्त करने के लिए strlen(line) का उपयोग करें। '\n' के साथ समाप्त होने पर 1 घटाएं।

यदि स्ट्रिंग में इसमें नए पंक्ति वर्ण हैं, तो आपको इसे नए लाइन वर्णों के चारों ओर विभाजित करने की आवश्यकता होगी और फिर प्रत्येक सबस्ट्रिंग पर strlen() पर कॉल करें।

+0

उसके पास कोई स्ट्रिंग नहीं है, उसके पास एक फ़ाइल है। – danben

1

आप fopen() को दूसरा तर्क में पाठ मोड, अर्थात् में एक फ़ाइल, एक b बिना खोलते हैं, तो आप वर्ण एक-एक करके जब तक आप एक '\n' मारा लाइन आकार निर्धारित करने पढ़ सकते हैं। अंतर्निहित प्रणाली को लाइन टर्मिनेटर के अंत में केवल एक वर्ण, '\n' पर अनुवाद करने का ख्याल रखना चाहिए। कुछ सिस्टम पर, टेक्स्ट फ़ाइल की अंतिम पंक्ति '\n' के साथ समाप्त नहीं हो सकती है, इसलिए यह एक विशेष मामला है।

स्यूडोकोड:

count := 0 
c := next() 
while c != EOF and c != '\n'" 
    count := count + 1 

ऊपर दिए गए पंक्ति में वर्णों की संख्या की गणना होती है। next() आपकी फ़ाइल से अगले चरित्र को वापस करने के लिए एक फ़ंक्शन है।

वैकल्पिक रूप से, आप एक बफर के साथ fgets() उपयोग कर सकते हैं:

char buf[SIZE]; 
count = 0; 
while (fgets(buf, sizeof buf, fp) != NULL) { 
    /* see if the string represented by buf has a '\n' in it, 
     if yes, add the index of that '\n' to count, and that's 
     the number of characters on that line, which you can 
     return to the caller. If not, add sizeof buf - 1 to count */ 
} 
/* If count is non-zero here, the last line ended without a newline */ 
+0

क्या आप SIZE को समझा सकते हैं .. मुझे यकीन नहीं है कि यह एक Var है या कमांड सी उपयोग करता है। – MRP

+0

@ एमआरपी: 'SIZE' एक सुविधाजनक सकारात्मक अभिन्न मूल्य है, या तो एक प्री-प्रोसेसर मैक्रो या एक जादू संख्या है। मैंने आपको एक पूर्ण कोड नहीं दिया क्योंकि मुझे यकीन नहीं है कि यह होमवर्क प्रश्न है या नहीं। :-) –

+0

ठीक है अगर SIZE एक संख्या है जिसे मैंने रखा है .. मुझे काम करने के लिए क्या चाहिए, क्योंकि मुझे आकार पता नहीं है .. – MRP

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