2010-10-14 127 views
2

我想將文本文件讀入字符串數組,並能夠通過循環訪問數組內容。我有的代碼允許我只存儲文本文件的最後一行而不是整個文件;我哪裏錯了?如何將文本文件中的字符串存儲到數組中C

#define MAX 10000 

int main (int argc, char *argv[]) 
{ 
    FILE *fp; 
    char str[MAX]; 
    char *x[MAX]; 
    int i =0; 
    char y[MAX]; 

    if((fp = fopen("550.txt", "r"))==NULL) { 
    printf("Cannot open file.\n"); 
    exit(1);} 

    while(!feof(fp)) { 
     while(fgets(str, sizeof str, fp)) { 
      x[i]= str; 
      printf("%s", str); 
      printf("%s", *(x+i)); 
      i++; 
     } 
    } 


for(i=0;i<100;i++){ 
    printf("%s", *(x+i)); 
} 

    fclose(fp); 

    return 0; 
} 
+0

不要使用FEOF()來控制迴路cond.http://c-faq.com/stdio/feof.html – Nyan 2010-10-14 18:27:51

回答

3

你只分配一個字符串數組str。在循環的每次迭代中,您只需簡單地覆蓋str。分配x[i] = str指針的值分配給strx[i]。您會注意到,陣列中的每個成員x都指向相同的緩衝區str在循環結束時。您需要創建多個緩衝區。要做到這一點

的一種方式是使用#define LINES 100定義的最大行數,然後申報x如下

char x[LINES][MAX]; 

,然後執行strcpy在每次迭代:

while(fgets(str, sizeof str, fp)) { 
    strcpy(x[i], str); 
    printf("%s", str); 
    printf("%s", *(x+i)); 
    i++; 
} 

注您應該考慮使用strncpy方法而不是strcpy並檢查返回值以確保緩衝區不會溢出。

+0

你肯定與fgets不會零終止長的輸入緩衝區? – Nyan 2010-10-14 18:29:21

+1

爲什麼這個答案downvoted? – 2010-10-14 20:36:12

1

你需要讓每個字符串的副本:

x[i] = strdup(str); 

你此刻在做什麼是使每個x[i]指向同一個緩衝區,其中將包含該文件一旦你的最後一行已經完成了。

(注:你還需要free()所有你strdup()創建x[i]字符串)。

+0

strdup不是ANSI C – user411313 2010-10-14 19:46:56

0

你是不是stroing你在任何地方閱讀行。它被緩衝到str中,但是你用下一行覆蓋它。使用strdup。

x[i] = strdup(str); 
相關問題