2012-05-12 9 views
5

सबसे पहले, मैंने फ़्रेड को कॉल करके एक बफर में एक पाठ पढ़ा, और फिर मैं लाइन से इसे लाइन को पढ़ना चाहता हूं, इसे कैसे करें? मैं एक एसएसकेएनएफ का उपयोग करने की कोशिश करता हूं, लेकिन ऐसा लगता है कि यह काम नहीं करता है।एक बफर में पाठ पढ़ने के बाद लाइन से रेखा को कैसे पढ़ा जाए?

char textbuf[4096]; 
char line[256]; 
FILE *fp; 
fp = fopen(argv[1],"r"); 
memset(textbuf, 0, 4096); 
fread(textbuf, 1, 4096, fp); 

मुझे पता है कि fgets का उपयोग करना एक अच्छा तरीका है। मैं बस मौसम जानना चाहता हूं यह विधि एक ही काम कर सकती है। आप एक चर से इसे पढ़ने के लिए चाहते हैं fgets(line, 128, fp) या getline(&line, &size, fp);

संपादित

, strtok() को देखो:

+0

'fgets का प्रयोग क्यों नहीं()' एक समय में फ़ाइल एक पंक्ति को पढ़ने के लिए? –

+0

या 'getline() 'यदि आप सिस्टम POSIX- संगत पर हैं .. – Jack

उत्तर

7

इस प्रयास करें:

fgets(textbuf, sizeof(textbuf), fp); 

पढ़ने लाइन के लिए लाइन द्वारा आप उपयोग कर सकते हैं समारोह:

char * line = strtok(strdup(buffer), "\n"); 
while(line) { 
    printf("%s", line); 
    line = strtok(NULL, "\n"); 
} 
+0

' fgets() 'या' getline() '? मन बना लो! :-) –

+0

@AdamLiss: यह निर्भर करता है। देखें कि यहां दो प्रश्न हैं। किसी को केवल fgets() का उपयोग करके हल किया जा सकता है और किसी अन्य को fgets() या getline() का उपयोग करके हल किया जा सकता है। – Jack

+0

दोनों fgets और getline फ़ाइल poiter की आवश्यकता है, तो, फ्रेड कॉल करने की कोई जरूरत नहीं है। मैं बफर से रेखा से रेखा को पढ़ना चाहता हूं, कैसे? –

2

कैसे strtok के बारे में

char *line; 
line = strtok(texbuf, '\n'); 
+0

'strtok()' का उपयोग करके _very_ सावधान रहें। यह पुनर्वित्तक नहीं है, और यह इसके इनपुट को संशोधित करता है क्योंकि यह इसे संसाधित करता है। –

+0

@ नहीं हाँ, मैं पहले ही यह जानता हूं कि, इसलिए यह सिर्फ एक कोशिश है। एक वैकल्पिक विधि। मुझे लगता है कि 'fgets' सबसे सरल है। –

0

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

नहीं

, लेकिन आप क्या करना है चीजों की तरह का एक नमूना।

#include <stdio.h> 
typedef struct my_state { 
unsigned char * buf; 
int offset; 
int buf_size; 
int left; 
FILE * file; 
} my_state_t; 
int takeone(my_state_t * state) { 
if ((state->left - state->offset)<=0) { 
    if (feof(state->file)) return -1; 
    state->left = fread(state->buf,1,state->buf_size,state->file); 
    state->offset = 0; 
    if (state->left == 0) return -1; 
} 
return state->buf[state->offset++]; 
} 
int getaline(my_state_t * state, char * out, int size) { 
int c; 
c = takeone(state); 
if (c < 0) return 0; 
while (c >=0 && size > 1) { 
    *out++ = c; 
    --size; 
    if (c == '\n') break; 
    c = takeone(state); 
} 
*out=0; 
return 1; 
} 
int main(int argc, char ** argv){ 
FILE *fp; 
char textbuf[4096]; 
char line[256]; 
my_state_t fs; 
fs.buf=textbuf; 
fs.offset=0; 
fs.buf_size=4096; 
fs.left=0; 
fp = (argc>1)? fopen(argv[1],"rb") : stdin; 
fs.file = fp; 
while (getaline(&fs,line,256)) { 
    printf("-> %s", line); 
} 
fclose(fp); 
} 
+0

जो लगभग मैं चाहता हूं। मैं लगभग भूल जाता हूं 'fgets' एक मुक्ति समारोह है, सिस्टम कॉल नहीं। –

5

आप अंत का स्थान पा सकते हैं ऑन लाइन चरित्र इस तरह strchr() का उपयोग कर:

char *eol = strchr(line, '\n'); 

सब कुछ पहले +०१२३५४५६७९४६पहली पंक्ति है। फिर line से eol + 1 से आगे बढ़ें, किसी भी \r या \n वर्णों को हटाएं, और strchr()NULL पर वापस जाने के लिए प्रक्रिया को दोहराएं ताकि यह संकेत न हो कि कोई और न्यूलाइन वर्ण नहीं हैं। उस बिंदु पर, किसी भी शेष डेटा को बफर की शुरुआत में ले जाएं और फ़ाइल से अगला खंड पढ़ें।

यदि आप दक्षता के बारे में चिंतित हैं तो आप 2 बफर का उपयोग करके डेटा को स्थानांतरित करने से बच सकते हैं और उनके बीच वैकल्पिक हो सकते हैं, लेकिन फ़ाइल की कई पंक्तियां होने पर भी निष्क्रिय विधि fgets() से अधिक तेज़ है।

+0

हाँ, मुझे लगता है कि यह काम करता है। –

+0

अब तक का सबसे अच्छा और सरल संस्करण! – br1

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