Excluir uma linha em arquivos c

Olá estou tentando dificuldade em excluir uma linha em arquivos c e eu não sei o que está errado no código então quem puder me ajudar eu agradeço muito.

void Remover_registro()
{
  FILE *fpin,*fpout;
  int *linha;


printf("\ndigite a linha do registro a ser deletado\n");
scanf("%d",&linha);

fpin = fopen("AgendaDeContatos.txt","r");
fpout = fopen("transferindo.txt", "w");
char texto[1001] = "";
unsigned int linha_selecionada = linha;
unsigned int linha_atual = 1;
while(fgets(texto, 1001, fpin) != NULL){
    if(linha_atual != linha_selecionada){
        fputs(texto, fpout);
    }
    memset(texto, 0, sizeof(char) * 1001);
    linha_atual += 1;
}
remove("AgendaDeContatos.txt");
rename("transferindo.txt", "AgendaDeContatos.txt");
fclose(fpin);
fclose(fpout);


}

Código completo: https://pastebin.com/Fhws9vsE

Acho que você não precisa abrir dois arquivos para esse procedimento, basta usar o modo (mode) certo:

#define LEN 1001
...
fp = fopen("AgendaDeContatos.txt","w+"); // w+ read/write
char texto[LEN]; // não precisa iniciar valor...
unsigned int linha_atual = 1;
while(fgets(texto, LEN, fp) != NULL){
    if(linha_atual != linha){ // desnecessário linha_selecionada se vc só usa para comparar...
        fputs(texto, fp);
    }
    linha_atual++;
}
fclose(fp);

E você não precisa do memset para “resetar” texto, o comportamento dele já serve como variável temporária e a cada fgets o conteudo é substituido…

Outro modo usado para leitura/escrita simultanea de arquivo é o r+, mas esse precisa ter o arquivo criado, já o w+ cria o arquivo se ele não existir (porém limpa o conteúdo do arquivo para reescrever)…

Evite usar números mágicos, hoje você lembra o 1001 mas e daqui 3 anos? Use sempre uma constante/identificador para isso além de facilitar a manutenção (se precisar mudar o valor muda só no define…)

Faça alguns testes e veja se te atende, boa sorte!