2015-11-20 86 views
0

我試圖從文本文件中讀取數據,並且試圖將文本的每一行放在指向char的指針中。我創建了char* ligne[nl];,其中nl是文本行的數量。嘗試從文本文件中讀取數據時發生的問題

問題是,當我嘗試打印文本的每個ligne[]時,我發現ligne值只有最後一行而不是文本的所有行。 看看代碼:

首先我的文件中的文本包含這些行:

mama 
kaka 
sasa 

我使用的代碼塊C,而且代碼:

int main(void) { 
    int i=0 ,k; 
    char *ligne[3] = {NULL}; // three char pointer that take each ligne 
    char word[25] = ""; 

    FILE* file = fopen("dico.txt", "r"); 

    if(file != NULL){ 
     while (fgets(word, 25, file) != NULL){ 
      ligne[i] = word; 
      i++; 
     } 

     // print each ligne of the file text 
     for(i =0 ; i < 3 ; i++){ 
      printf("%s" , ligne[i]); 
      printf("\n"); 
     } 
    } 
    return 0; 
} 

和結果打印ligne[i]是:

sasa 
sasa 
sasa 

代替:

mama 
kaka 
sasa 

我在做什麼錯?

+3

這是C還是C++?如果它是純C代碼,則刪除C++標記。 – Slava

+0

好吧,你對了 –

回答

2

問題是您正在將ligne數組中的每個索引指向字數組。因此,當您完成fgets while循環時,所有索引都將指向數組中的數據,這是sasa(因爲這是放入字數組中的最後一個字,即您覆蓋了其他字) 。 可能的解決方案是聲明您的ligne陣列如下:

char ligne[4][25]

然後調用與fgets這樣:

fgets(ligne[i], 25, file)

在每一輪while循環的。

+0

你也可以使用'fgets(ligne [i],sizeof(ligne [i]),file)''。 –

+0

exelent這是工作良好,非常感謝你 –

+0

waw完美我瞭解你的建議,你說,在循環結束while(fgts!= NULL)時,ligne數組包含最後一個值,這是字[25]! (y) –

1

問題是,你總是讀下一個單詞到「單詞」,你讓所有的ligne [i]元素指向相同的變量,「單詞」。如果您確實知道單詞的大小和您可以執行的行數:

int main(int argc, char **argv) { 
    int i=0 ,k; 
    char ligne[4][25]; // three char pointer that take each ligne 

    FILE* file = fopen("dico.txt" , "r"); 

    if(file != NULL){ 
     while (fgets(ligne[i] , 25 , file) != NULL) { 
      i++; 
     } 

// print each ligne of the file text 

    for(i =0 ; i < 3 ; i++){ 
     printf("%s" , ligne[i]); 
     printf("\n"); 
     } 
    } return 0; 
} 

請注意,ligne聲明爲4行。原因是在第三行之後,你仍然將ligne [4]傳遞給fgets,即使fgets將返回NULL,你傳入的指針應該是有效的。

另請注意,代碼是非常危險的。我依賴的文件沒有超過3行,或者更確切地說,fgets返回NULL爲第4次調用。這些不同於每次通話中消耗的字符數限制在每個通話中的24(25-1)。如果這個假設失敗了,那麼你會有各種有趣的記憶錯誤。

1

您正在用任何新讀取覆蓋之前讀取的值。調試將顯示每個ligne元素指向相同的內存地址。相反,請明確創建一個多維數組並手動引用要分配給哪個元素。

const unsigned int NUM_LINES = 3; 
int i = 0; 
char *ligne[3] = { NULL }; // three char pointer that take each ligne 
char word[NUM_LINES][25]; 

FILE* file = fopen("dico.txt", "r"); 

if (file != NULL) 
{ 
    while (fgets(word[i], 25, file) != NULL){ 
     ligne[i] = word[i]; 
     i++; 
    } 

    // print each ligne of the file text 
    for (i = 0; i < 3; i++) 
    { 
     printf("%s", ligne[i]); 
     printf("\n"); 
    } 
} 
return 0; 
+0

哇,這也是完美的工作謝謝你 –

相關問題