Ir ao conteúdo

Dúvida C: excluindo uma das entradas de um arquivo binário


mc.escher

Posts recomendados

Postado

Fala pessoal, boa noite.

Tô quebrando a cabeça o dia inteiro e ainda nao achei o(s) erro(s) q cometi. Criei uma função excluir(); ela consegue excluir o valor dado, mas acaba sempre duplicando o valor posterior!

O programa é como uma agenda, com dados organizados em struct (como se fosse uma agenda, uma relação de vários itens...)

Provavelmente cometi erros graves, ainda sou bem iniciante em C. Não sei se o código que postei é suficiente, se não for eu posto o resto do programa.

Valeu!


/* Funcao excluir: exclui a entrada oferecida pelo usuário
Todos os itens receberam anteriormente um código único,
fornecido pelo usuário.*/

void excluir()
{
int valor=0;
arquivo = fopen("material.bin","rb");
tmp = fopen("tmp.bin", "wb");
if((arquivo == NULL)||(tmp ==NULL))
{
printf("\n\nErro ao abrir o arquivo.\n\n\n");
system("pause");
system("cls");
}
else
{
printf("\n");
printf("\n ->Digite o codigo do material a ser EXCLUIDO: ");
scanf("%d",&valor);
fflush(stdin);
/*--- busca(valor) - funcao que criei antes para
verificar se o código existe ---*/
if(busca(valor) == 0)
{
printf("\nCodigo invalido!\n");
system("pause");
}
else
{

rewind(arquivo);
while(!feof(arquivo))
{
fread(&C,sizeof(C),1,arquivo);
if(C.codigo!=valor) fwrite(&C, sizeof(C), 1, tmp);
}
fclose(arquivo);
fclose(tmp);
remove("material.bin");
rename("tmp.bin", "material.bin");
printf("Entrada excluida com sucesso!");
system("pause");
system("cls");


}
}

}

Postado

Realmente apagar ifnroamções é um problema....mais você pode contornar utilizando STATUS, ou seja, você cria um campo chamado status na sua estrutura que pode ser "ativo", "deletado", assim, na hora de fazer a consulta você da um

if (A->status == "A") 

ou seja, se estiver ativo você imprime

assim você pode fazer 2 relatórios. Um para os Itens ativos e caso queira pode imprimir os itens deletados.

Postado

Achei o erro, na verdade foi só trocar o argumento do "while" de

!feof(arquivo)

por

fread(&C,sizeof(C),1,arquivo);

Assim, ela evita que se retorne mais uma vez o último valor:


while(fread(&C,sizeof(C),1,arquivo))
{
if(C.codigo!=insc) fwrite(&C, sizeof(C), 1, tmp);
}

Valeu, inf-paulo, pela força!

Abraços!

admin, pode fechar o tópico.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...