2012-03-05 22 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行はファイル内の行数)だけが出力されます。

ご了承ください。前もって感謝します。

+0

コードをインデントしてください。 –

+0

'char array [20]; protocol_array [protocol_index] = array; 'それが問題です。 –

+0

私は思った。そのために残念。一部の人は私のためにそれをインデントしました。 ;) – mtndesign

答えて

1

char* protocol_array[];には、割り当てられたメモリへのポインタ以外のデータを直接入れることはできません。

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

を又はmalloc介してメモリを割り当てる:

どちらこのような長さ20とstrcpyのと列の6ライン分の記憶領域を割り当て、char protocol_array[20][6];としてprotocol_arrayを定義する必要

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] =配列; - この行が問題だと思われる。 strcpyを実行する必要があります。

配列を割り当てるたびに、array(ローカル配列)のアドレスだけがprotocol_arrayのすべての要素に格納されます。あなたのコードから明らかなように、最後の読み込み行は "配列"にあり、protocol_arrayのすべての要素は "配列"のアドレスを指しているので、すべての要素に対してそれを表示します。

+0

私は試しましたが、もう一度試してみます。 – mtndesign

+0

しかし、strcpyを実行する場合は、protocol_arrayの各要素に割り当てられるメモリも必要です。プロトコル配列がchar * protocol_array []の場合、各要素のメモリ割り当てが必要です。それには注意してください。 – Jay

関連する問題