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!