2012-03-05 43 views
1

我有一個非常奇怪的問題,在C中的fgets()。下面是我正在使用的代碼。C fgets() - 只有文件的最後一行寫入數組?

FILE* conf_file; 
char array[20]; 
conf_file=fopen("configuration","r"); 
if (!conf_file) printf("There is not conf file"); 
while(!feof(conf_file)){ 
    // if(feof(conf_file)) break; 
    fgets(array,20,conf_file); 
    //printf("%s",array); 
    if (!read_id_flag){ 
     labris_id=atoi(array); 
     read_id_flag=1; 
     printf("%d\n",id); 
     continue; 
    } 
    protocol_array[protocol_index]=array; 
    // printf("%s %s",array,protocol_array[protocol_index]); 
    protocol_index++; 
} 
int i; 
for(i=0;i<10;i++){ 
    printf("%s",protocol_array[i]); 
} 
fclose(conf_file); 

那麼,在同時範圍,如果我嘗試打印它完美的protocol_array。但是,如果我試圖在while範圍之後打印數組,則只打印數組的最後一行,6次(6是文件中的行數)。

任何想法是讚賞。提前致謝。

+0

請縮進你的代碼.. – 2012-03-05 09:29:32

+0

char array [20]; protocol_array [protocol_index] = array;'這就是問題所在。 – 2012-03-05 09:30:26

+0

我以爲我做到了。對不起。有些人爲我縮進。 ;) – mtndesign 2012-03-05 09:31:11

回答

1

char* protocol_array[];不能直接包含任何數據,除了指向分配的內存的指針。

你應該要麼限定protocol_array作爲char protocol_array[20][6];,6行字符串的長度爲20和strcpy這樣分配存儲:

char protocol_array[20][6]; 
//... 
strcpy(protocol_array[protocol_index], array); 

或經由malloc分配內存:

char** protocol_array = malloc(6 * sizeof(char*)); 
//... 
protocol_array[protocol_index] = malloc(strlen(array)+1); 
strcpy(protocol_array[protocol_index], array); 

注意在後一種情況下,您應完成free任何分配的內存:

for(i = 0; i<protocol_index; ++i) 
    free(protocol_array[i]); 
free(protocol_array); 
0

protocol_array [protocol_index] = array; - 這條線似乎是問題所在。你應該做一個strcpy。

如果每次都繼續分配數組,那麼只有array(它是本地數組)的地址存儲在protocol_array的所有元素中。從代碼中可以看出,最後一行讀取行將出現在「數組」中,並且由於protocol_array的所有元素都指向了「數組」的地址,因此只會打印所有元素。

+0

我試過了,但我會再試一次。 – mtndesign 2012-03-05 09:38:32

+0

但是,如果你打算做一個strcpy,那麼你還應該爲protocol_array的每個元素分配一些內存。如果你的協議數組是char * protocol_array [],那麼它需要爲每個元素分配內存。小心一點。 – Jay 2012-03-05 09:40:39

相關問題