2016-02-08 136 views
-2

這樣做我有很多困難!我所做的是第一行初始化指針數組,然後想要將這些塊指向包含文本文檔中字符串的變量。然而;即使我將所有值讀入數組,它們都指向與文件正在讀取時相同的變量。有沒有辦法我可以將這些值複製到數組中,而不必在文件正在讀取時指向變化的行?將文件一行一行讀入C中的一個數組

int main(void){ 
FILE * fp; 
char line[256]; 
int i = 0; 
int digit = 0; 

fp = fopen("testfile","r"); 

if(fp == NULL){ 
    printf("Cannot Open File"); 
} 
fgets(line,sizeof(line),fp); 
digit = atoi(line); 
printf("digit = %d\n",digit); 
char *rest[digit]; 
while(!feof(fp)){ 
    while (i < digit){ 
     fgets(line,sizeof(line),fp); 
     fgets(line,sizeof(line),fp); 
     printf("line = %s",line); 
     char arr[sizeof(line)+1]; 
     strcpy(arr,line); 
     rest[i] = arr; 
     printf("restaurant = %s",rest[i]); 
     i++; 
    } 

文本文件如下:

6 
Outback Steakhouse 
Red Robin 
Max & Erma’s 
Chipotle 
Panera 
BW3 
8 
Stephanie 5 3 2 4 
Chris 4 6 5 1 
Peter 5 2 4 1 
Josh 1 4 3 6 
Jessica 5 2 3 4 
Al 6 4 2 3 
Adam 5 1 3 2 
Eric 1 4 3 5 
+0

'rest [i] = arr;'這只是將數組中的每個條目指向同一個緩衝區。所以當然每個條目的結果都是相同的字符串。您需要爲每個字符串分配獨立的內存緩衝區。 – kaylum

+1

爲什麼在這段時間之後兩次調用fgets(我<數字)。你將會丟掉一半數據。 –

+0

看看http://stackoverflow.com/a/19174415和http://stackoverflow.com/a/4237107 –

回答

0

您需要的值複製到動態分配的內存。 strdup會做。替換:

char arr[sizeof(line)+1]; 
    strcpy(arr,line); 
    rest[i] = arr; 

有了:

rest[i] = strdup (line); 

你也叫fgets兩次。

此外,當行太長時,它不會被零終止。爲了安全起見,在line的末尾始終指定零。

相關問題