2010-11-21 18 views
5

में संग्रहीत करना मैंने फ़ाइल से लाइन द्वारा लाइन को पढ़ने और शब्दों के सरणी में संग्रहीत करने के लिए निम्न प्रोग्राम लिखा है। आउटपुट सरणी से दो यादृच्छिक शब्द होना चाहिए। लेकिन आश्चर्यजनक रूप से शब्द सरणी में केवल अंतिम शब्द बार-बार पढ़ा जाता है। क्या गलत हो गया पर कोई मदद?फ़ाइल से पढ़ना और सरणी

int main(){ 
int i = 0; 
char line_buffer[BUFSIZ]; 
char* words[20]; 
FILE *fp = fopen("input.txt", "r"); 
    while (fgets(line_buffer, sizeof(line_buffer), fp)) { 
    //printf("%s", line_buffer); 
    words[i] = line_buffer; 
    i = i + 1; 
} 
printf("%d", i); 
int j = rand()%8; 
    int k = (j+1)%8; 
printf("%s %s", words[j], words[k]); 
fclose(fp); 
return 0; 
} 

nematode knowledge 
empty bottle 
nevertheless 
claustrophobia 
metamorphosis 
acknowledgement 
impossibility 
never gave up 
+8

कभी भी आपको देने वाला नहीं है! कभी नहीं ... ओह, क्षमा करें। –

+0

मैंने पायथन टैग –

+0

हटा दिया मैंने देखा:) ... –

उत्तर

6

आप डेटा की प्रत्येक पंक्ति को उसी बफर में पढ़ते हैं, इसलिए अंतिम पंक्ति सभी पिछली पंक्तियों को ओवरराइट करती है। आपको प्रत्येक लाइन के लिए किसी अन्य माध्यम से स्थान आवंटित करना होगा - या तो malloc() (या संभवतः strdup()) के साथ गतिशील स्मृति आवंटन, या एक निश्चित आकार सरणी का उपयोग करना (जो आपके प्रोग्राम को सुरक्षित रूप से संभाल सकता है) की मात्रा को सीमित करता है। आपको डेटा पढ़ने में नई लाइनों से निपटने की भी आवश्यकता होगी।

आपको fgets() का उपयोग करने के लिए कुछ क्रेडिट मिलता है और gets() का उपयोग नहीं करते हैं; यह 100% सही निर्णय है।


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

enum { MAXLINES = 30 }; 

int main(void) 
{ 
    int i = 0; 
    char lines[MAXLINES][BUFSIZ]; 
    FILE *fp = fopen("input.txt", "r"); 

    if (fp == 0) 
    { 
     fprintf(stderr, "failed to open input.txt\n"); 
     exit(1); 
    } 
    while (i < MAXLINES && fgets(lines[i], sizeof(lines[0]), fp)) 
    { 
     lines[i][strlen(lines[i])-1] = '\0'; 
     i = i + 1; 
    } 
    fclose(fp); 
    printf("%d\n", i); 
    srand(time(0)); 
    int j = rand() % i; 
    int k = (j+1) % i; 
    printf("%s %s\n", lines[j], lines[k]); 
    return 0; 
} 

यह जाँच करता है कि फ़ाइल सफलतापूर्वक खोला गया था, जैसे ही पढ़ने पूरा हो गया है के रूप में फ़ाइल बंद कर देता है, और यह सुनिश्चित करता है कि यह अधिक लाइनों की तुलना में सरणी धारण कर सकते हैं पढ़ कर एक ढेर अतिप्रवाह ट्रिगर नहीं करता। यह अंतरिक्ष आवंटित करके बहुत अधिक जगह बर्बाद कर देता है ताकि प्रत्येक पंक्ति बहुत लंबी हो (हालांकि रेखाएं आम तौर पर काफी छोटी होती हैं)। यदि कोई लाइन BUFSIZ से अधिक लंबी है, तो इसे lines में कुछ आसन्न प्रविष्टियों में पढ़ा जाएगा। यह नहीं लगता कि डेटा फ़ाइल में 8 लाइनें हैं। यह प्रत्येक पंक्ति के अंत में नई लाइन को झपकी देता है (जब तक कोई रेखा विभाजित नहीं होती है, इस स्थिति में यह दो पंक्तियों के पहले विभाजन पर जाने से पहले अंतिम चरित्र को झपकी देता है)। यह वर्तमान समय के साथ यादृच्छिक संख्या जेनरेटर बीज। यह अजीब लगता है कि आप केवल फाइल से आसन्न लाइनों को चाहते हैं।

+0

मुझे इसे पूरी तरह से नहीं मिला .. क्या आप नमूना कोड के साथ आवंटन दिखा सकते हैं? निश्चित आकार सरणी करेंगे। – razor35

1

input.txt आप srand साथ यादृच्छिक संख्या जनरेटर को प्रारंभ किया था? is available here का उपयोग करने के उदाहरण के साथ एक स्पष्टीकरण।

2

आप बार-बार लाइन_बफर में स्मृति को ओवरराइट करते हैं। शब्द सरणी में केवल इस चर को पॉइंटर्स शामिल हैं।

आपको या तो एक बहु-आयामी सरणी का उपयोग करना चाहिए या रनटाइम पर स्मृति आवंटित करना चाहिए।

Btw: खराब बातें होती हैं जब आप अपने कोड में 20 से अधिक लाइनों पारित ...

3
int main(){ 
int i = 0; 

int BUFSIZE = 1000; 
char* words[20]; 
FILE *fp = fopen("input.txt", "r"); 
if (fp == 0){ 
     fprintf(stderr, "Error while opening"); 
     exit(1); 
} 

words[i] = malloc(BUFSIZE); 
    while (fgets(words[i], BUFSIZE, fp)) { 
     i++; 
     words[i] = malloc(BUFSIZE); 
} 
printf("Output: \n"); 
srand(time(NULL)); 
int j = rand()%i; 
int k = (j+1)%i; 
fflush(stdout); 
printf("%d - %s %d -%s", j, words[j], k, words[k]); 

int x; 
for(x = 0; x<i; x++) 
     free(words[x]); 
scanf("%d", x); 
fclose(fp); 
return 0; 
} 

ps। माल्को परिणाम

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