Ler e salvar no arquivo, jogar numa struct e exibir com printf

Estou com um problema que aparentemente é bem simples. O programa precisa obter dados sobre controle de vendas de uma loja. Ele armazenará o nome e o telefone do(s) cliente(s), jogará num arquivo .txt e depois exibirá os dados digitados do(s) cliente(s) na tela. Preciso utilizar no programa estruturas de repetição, vetor, ponteiros, alocação dinâmica e estruturas. Quando executo o código abaixo o programa para de funcionar, e não salva no .txt.

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

typedef struct{
	char nome[50], tel[20];
}dados;

int main(){
	FILE *arq;
	char nome[50], tel[20];
	int i, n;
	dados cliente, *p;

	p=&cliente;
	
	printf("CONTROLE DE VENDAS\n Digite o numero de clientes: ");
	scanf("%d", &n);
	
	p=(dados*)calloc(n, sizeof(dados));
	if(p==NULL){
		printf("Memoria insuficiente!");
		return 0;
	}
	for(i=0;i<n;i++){
		printf("DADOS DO CLIENTE\n");
		printf("Digite o nome do cliente %d: ", i+1);
		fflush(stdin);
		gets(p[i].nome);
		printf("Digite o telefone: ");
		fflush(stdin);
		gets(p[i].tel);
	}	
	
	arq=fopen("ControleDeVendas.txt", "a");
	if(!arq){
	printf("Erro na abertura do arquivo!");
	exit;
	}
	
	fprintf(arq, "%s\n", nome);
	fprintf(arq, "%s\n", tel);
	fclose(arq);
	
	for(i=0;i<n;i++){
		printf("O cliente %s - Tel: %s\n", p->nome, p->tel);
		p++;
	}
	free(p);
	system("pause");
	return 0;
}