2011-01-25 11 views
0

関数read_conf関数では、設定ファイルから読み込み、print関数を使用すると構造体が必要に応じて表示されます。ファイルからの読み込みのために構造体配列を使用する際の問題

私がDisplay関数を呼び出すと、read関数の最後のエントリだけが表示されるので、読み込みに問題があります。

struct { 
    char *ext; 
    char *filetype; 
    } extensions [10]; 

void read_conf() 
{ 
char buf[BUFSIZE]; 
char *free1 = NULL; 
char *free2 = NULL; 
FILE *fp; 
fp=fopen("config.conf", "r"); 
int i_mime = 0; 
while(fgets(buf,sizeof(buf), fp)) 
{ 
    if(!strncmp(buf,"Listen ",7)) 
    { 
    Port_serv_list = &buf[7]; 
    printf("Port number read from conf file is : %s\n", Port_serv_list); 
    } 
    if(!strncmp(buf,"DocumentRoot ",13)) 
    { 
    Dir = &buf[13]; 
    printf("Directory read from conf file is : %s\n", Dir); 
    } 
    if (buf[0] == '.') 
    { 
    free1 = strtok(buf," "); 
    extensions[i_mime].ext = &free1[1]; 

    free2 = strtok(NULL," "); 
    extensions[i_mime].filetype = free2; 
    printf("ext: %s\n",extensions[i_mime].ext); 
    printf("filetype: %s\n%d\n",extensions[i_mime].filetype, i_mime); 
    i_mime++; 
    //printf("Data from conf file \": %s\n",buf); 
    } 
} 
} 

void Display_Content_Conf() 
{ 
int j_mime = 0; 
printf("Displaying content of Extension Structure array:""\n"); 
for(j_mime;j_mime<=7;j_mime++) 
{ 
    printf("ext: %s\n",extensions[j_mime].ext); 
    printf("filetype: %s\n%d\n",extensions[j_mime].filetype, j_mime); 
} 
} 

出力:エクステンション構造配列の

ext: htm 
filetype: text/html 

0 
ext: html 
filetype: text/html 

1 
ext: txt 
filetype: text/plain 

2 
ext: jpeg 
filetype: image/jpeg 

3 
ext: jpg 
filetype: image/jpeg 

4 
ext: png 
filetype: image/png 

5 
ext: gif 
filetype: image/gif 

6 
ext: bmp 
filetype: image/bmp 

7 

表示内容:

ext: bmp 
filetype: image/bmp 

0 
ext: bmp 
filetype: mage/bmp 

1 
ext: bmp 
filetype: image/bmp 

2 
ext: bmp 
filetype: mage/bmp 

3 
ext: bmp 
filetype: image/bmp 

4 
ext: bmp 
filetype: image/bmp 

5 
ext: bmp 
filetype: image/bmp 

6 
ext: bmp 
filetype: image/bmp 

7 

答えて

2

それは上に上書きされているbufに向いて残されextensions構造内のポインタ、のように見えますそれぞれループを通過します(そして、read_confを終了すると割り当てが解除されます。すべてが未定義の動作です)。

strtokから返された文字列にstrdupを呼び出して、それらを安全に保存するために新しく割り当てられたダイナミックメモリに入れる必要があります。このような何か:

free1 = strtok(buf," "); 
extensions[i_mime].ext = strdup(&free1[1]); 

free2 = strtok(NULL," "); 
extensions[i_mime].filetype = strdup(free2); 

はちょうどあなたが不要になった場合 strdupによって返さ free()文字列に覚えています。病気運のいくつかのストロークによって、あなたのC環境が(それはANSI Cではないですが、 はPOSIXでです) strdup機能を提供していない場合、あなたはそれを供給することができます - それはかなり簡単です:

/* Duplicates a supplied string. */ 
char *strdup(const char *input) 
{ 
    /* Required buffer size is the string length, plus 1 for terminator. */ 
    size_t size = strlen(input) + 1; 

    /* Allocate buffer. If it fails, return NULL for failure. */ 
    char *dup = (char *) malloc(size); 
    if (dup == NULL) return NULL; 

    /* Now copy the string data into the newly allocated buffer and return it. */ 
    memcpy(dup, input, size); 
    return dup; 
} 
+0

だけ頭をストールアップは拡張です。 –

+0

ヌルセット....答えをいただきありがとうございました。実際に問題を解決しました。 – Glex

+1

@Null Setさて、私は 'strdup'のANSI C実装を添付しました。満足? ;-) –

関連する問題