Listar dados de uma vetor de struct dinamico

Olá, eu estou com problema na hora de listar os dados de um arquivo usando uma struct dinamico para ler eles,pois não retorna os caracteres inseridos no arquivo em C.

O erro ta marcado no código “void listar_dados()” embaixo

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>


void incluir_dados(void);
void listar_dados(void);

struct aluno
{
   char nome[30];
   int idade;
   char sexo[10];
};

struct aluno *a;


main()
{

  int op;

  while(true)
  {
  printf("Digite a opcaso desejada: ");
  scanf("%d",&op);

 switch(op)
  {
  case 1:
  incluir_dados();
  break;

  case 2:
  listar_dados();
  break;

  case 3:
  exit(0);
  break;

  default:
  fflush(stdin);
  printf("\nOpcao Invalida\n");
  break;

  }


  }



}


void incluir_dados()
{
a=(struct aluno *)malloc(sizeof(struct aluno));
int i;
FILE *fp;
fp=fopen("APS.txt","w+");
if(fp==NULL)
{
    printf("Falha ao abrir o arquivo");
    exit(0);
}

for(i=0;i<5;i++)
{
printf("\nDigite o nome do aluno: ");
scanf("%s",&a[i].nome);
printf("\nDigite a idade do aluno: ");
scanf("%d",&a[i].idade);
printf("\nDigite o sexo do aluno: ");
scanf("%s",&a[i].sexo);
fprintf(fp,"%s\n%d\n%s\n",a[i].nome,a[i].idade,a[i].sexo);
}


free(a);
fclose(fp);


}


void listar_dados()
{
a=(struct aluno *)malloc(sizeof(struct aluno));
FILE *fp;
int i=0;

fp=fopen("APS.txt","r+");
if(fp==NULL)
{
printf("Falha ao abrir o arquivo");
}

//ERRO
while(fscanf(fp,"%[^\n]s %[^\n]d %[^\n]s",a[i].nome,a[i].idade,a[i].sexo)!=NULL)
{
 printf("%s\n",a[i].nome);
 printf("%d\n",a[i].idade);
 printf("%s\n",a[i].sexo);
i++;
}
//ERRO

free(a);
fclose(fp);
}