Programa em C não salva dados digitados pelo usuário

Por favor, analise o seguinte programa:

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

char registro[32];
FILE *fp;

int main() {
    int tam, espacos, i, opcao;
    fp = fopen ("teste.txt", "a");
    if (fp == NULL) {
	return 1;
    }

    char *nome = (char*) calloc(21, sizeof(char));
    if (!nome)
    {
        printf ("** Erro: Memoria Insuficiente **");
        free(nome);
        return 1;
    }

    char *cpf = (char*) calloc(12, sizeof(char));
    if (!cpf)
    {
        printf ("** Erro: Memoria Insuficiente **");
        free(cpf);
        return 1;
    }
    
    do {
	system ("cls");
	printf("\n\nNome: ");
        gets(nome);
        strcat(registro, nome );
        tam = strlen(nome);
        espacos = 20 - tam;
        for (i=1;i<=espacos;i++) strcat(registro, " ");
    
	printf("\nCPF: ");
        gets(cpf);
        strcat(registro, cpf );
        strcat(registro, "\n");

        fprintf(fp, "%s", registro);
	printf("\nRegistro salvo com sucesso!\n\n");

	printf("Continuar inserindo? (1=Sim/0=Nao): ");
        scanf("%d",&opcao);
	setbuf(stdin, NULL);
        printf("\n");

    } while (opcao != 0);


    fclose(fp);

//    printf ("\n\nRegistros salvos em teste.txt com sucesso!\n\n");

    return 0;
}

Por que não consigo salvar os dados digitados pelo usuário com esse programa.
Estou fazendo um programa como trabalho de faculdade, e vou me debruçar na funcionalidade de leitura, pois consegui persistir os dados no programa propriamente do trabalho, inclusive com muito mais campos (13, para ser mais específico).
Esse programa acima fiz somente para procurar fazer uns testes de leitura usando getc.

Se alguém descobrir o por quê de não persistir os dados, agradeço.

Até mais,

Bom amigo tenta alterar isso fp = fopen (“teste.txt”, “w”); e vê se funciona.