/*（問題文）ファイルgifts.datからデータを読み込み、構造体のポインタ拝謁にデータを格納する。この際、利用する分だけ動的にメモリを確保する。読み込んだ結果は、gifts.datとは別のファイルに出力せよ。（ファイル名は自由）また、入力ファイル名を標準入力から指定できるようにせよ。

gifts.dat

JZK-30 jizake_tsumeawase 4500
BSP-15 Body_soap_set 3000
BT-200 Bath_towel_set 2500
TEA-20 koutya_tsumeawase 5000

実行例：
データ数を入力してください：４
ファイル名を入力してください：gifts.dat
表示形式変換後ファイルに出力しました

以下自分で書いたソースコード、ファイル指定してファイルを開こうとしたところがセグメンテーション違反になっていてどうすればいいか分かりません。できれば書いたコードの追加、最小限の修正で教えていただきたいです。*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 50
typedef struct GIFT{
  char code[max];
  char name[max];
  int price;

}f;

int main()
{
  FILE *fp;
  FILE *afp;
  f *gift[10];
  char a[max],b[max],c[max];
  int d,e,i,j;

  printf("データ数を入力してください:");
  scanf("%d\n",d);
  printf("ファイル名を指定してください:");
  scanf("%s\n", a);


  fp = fopen(a,"r");
  afp = fopen("presents","w");  
  if(fp == NULL){
    printf("ファイルが開けませんでした.\n");
    return 1;
  }
  if(afp == NULL){
    printf("ファイルが開けませんでした.\n");
    return 1;
  }
 

  for(i = 0; i < d; i++)
    {
      fscanf(fp,"%s %s %d",b ,c ,&e) != EOF;

      gift[i] = (f*)malloc(sizeof(f)*(d+1));

      strcpy(gift[i]->code,b);
      strcpy(gift[i]->name,c);
      gift[i]->price = e;

      fprintf(afp,"code: %s\n name: %s\n price: %d\n",gift[i]->code, gift[i]->name, gift[i]->price);

 

    }

  printf("表示形式変換後ファイルに出力しました.\n");

  for(j = 0; j < d; j++)
    {
      free(gift[j]);

    }

  fclose(fp);
  fclose(afp);


  return 0;
}
