2010-11-21 120 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; 
} 

input.txt中

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

永遠不會放棄你!永遠不會......哦,對不起。 – 2010-11-21 08:49:35

+0

我刪除了Python標記 – 2010-11-21 08:53:20

+0

我注意到:)... – 2010-11-21 08:54:18

回答

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 2010-11-21 09:06:59

1

你初始化srand隨機數發生器?一個解釋,以及如何使用它的例子is available here

2

您重複覆蓋line_buffer中的內存。單詞數組只包含指向這個變量的指針。

您應該在運行時使用多維數組或分配內存。

順便說一句:當你通過超過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。檢查malloc結果

相關問題