Ir para conteúdo
Fórum Script Brasil
  • 0

Erro em função para editar arquivo


steel_sp

Pergunta

Senhores, estou com um problema em um trecho de código aqui. Quando eu chamo a função para editar um registro em um arquivo .txt, ela aparentemente edita, porém apaga todos os outros registros. Creio que seja algum erro de lógica. Avaliem o código, por gentileza:

altera_reg()
{
    int i, j, x, chave_busca[11];
    char in_cpf=0, out_cpf[11];
    arquivo=fopen("cadastro.txt","rw");
    if (arquivo==NULL)
    {
        puts("Erro ao abrir o arquivo!\n");
    }
    printf("\nDigite o CPF do cadastro que deseja alterar: ");
    for(i=0;i<11;i++)
     {
        if (((i-1) == 2)||((i-1) == 5)) printf(".");
        if ((i-1) == 8) printf("-");
        in_cpf = getch();
        while ((in_cpf<48) || (in_cpf>57))
        {
            in_cpf=getch();
        }
        putch(in_cpf);
        out_cpf[i]=in_cpf;
    }
    for(i=0;i<11;i++) chave_busca[i]=out_cpf[i]-48;
    fread(&dados,sizeof(dados),1,arquivo);
    while(!feof(arquivo))
    {
        for (i=0;i<11;i++)
        {
            if(dados.cpf[i]==chave_busca[i])
            {
                fseek(arquivo,sizeof(dados),SEEK_CUR);
                j=TRUE;
            }
        }
        fread(&dados,sizeof(dados),1,arquivo);
    }
    if (j!=TRUE) printf("\n\nCadastro não encontrado!");
    else
    {
    arquivo=fopen("cadastro.txt","wb");
    if(arquivo==NULL) printf("\nErro ao abrir o arquivo: ");
    cont++;
    dados.code=cont;
    printf("\n\nNome: ");
    fflush(stdin);
    gets(dados.nome);
    printf("\nEndereco: ");
    fflush(stdin);
    gets(dados.ende);
    printf("\nTelefone: ");
    fflush(stdin);
    gets(dados.fone);
    printf("\nRG: ");
    fflush(stdin);
    gets(dados.rg);
    digitacpf();
    validacpf();
    for (x=0;x<11;x++) dados.cpf[x]=cpf[x];
    printf("\n\nAlteracao realizada com sucesso!\n\n");
    fwrite(&dados,sizeof(dados),1,arquivo);
    fclose(arquivo);
    }
}

Obrigado!

Editado por steel_sp
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Porque você abre o mesmo arquivo duas vezes? Na primeira só faz a busca, na segunda grava. Não há porque fazer assim. Abra só uma vez. E está no manual da função fopen(): o switch "wb" (na segunda abertura) destrói o conteúdo. Por isso os dados somem. Abra o arquivo uma vez só, mas com o switch "r+b". Assim você poderá calcular o fseek() para gravar exatamente sobre o ponto da alteração.

Mais: considere o uso da função fprintf(), que facilitará a gravação no arquivo.

Editado por Maligno
Link para o comentário
Compartilhar em outros sites

  • 0

Aliás, você fecha a alça da segunda abertura do arquivo, mas o da primeira abertura permanece aberto. Não se pode dizer que é um erro, até porque a primeira alça, não fechada, se fecha na morte do programa. Pelo que sei o SO cuida para que o fechamento seja feito. Mas realmente não é uma boa prática. Se abrir o arquivo, feche-o quando não for mais necessário.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu pelas dicas Maligno! Dei uma mexida no código e agora está alterando, porém sempre o segundo registro. Possui incluir 10 registro que ele sempre vai alterar o segundo. Olhe como ficou o código:

altera_reg()
{
    int i, j, x, chave_busca[11];
    char in_cpf=0, out_cpf[11];
    arquivo=fopen("cadastro.txt","r+b");
    if (arquivo==NULL)
    {
        puts("Erro ao abrir o arquivo!\n");
    }
    printf("\nDigite o CPF do cadastro que deseja alterar: ");
    for(i=0;i<11;i++)
     {
        if (((i-1) == 2)||((i-1) == 5)) printf(".");
        if ((i-1) == 8) printf("-");
        in_cpf = getch();
        while ((in_cpf<48) || (in_cpf>57))
        {
            in_cpf=getch();
        }
        putch(in_cpf);
        out_cpf[i]=in_cpf;
    }
    for(i=0;i<11;i++) chave_busca[i]=out_cpf[i]-48;
    fread(&dados,sizeof(dados),1,arquivo);
    while(!feof(arquivo))
    {
        for (i=0;i<11;i++)
        {
            if(dados.cpf[i]==chave_busca[i])
            {
                fseek(arquivo,sizeof(dados),SEEK_CUR);
                j=TRUE;
            }
        }
        fread(&dados,sizeof(dados),1,arquivo);
    }
    if (j!=TRUE) printf("\n\nCadastro não encontrado!");
    else
    {
    cont++;
    dados.code=cont;
    printf("\n\nNome: ");
    fflush(stdin);
    gets(dados.nome);
    printf("\nEndereco: ");
    fflush(stdin);
    gets(dados.ende);
    printf("\nTelefone: ");
    fflush(stdin);
    gets(dados.fone);
    printf("\nRG: ");
    fflush(stdin);
    gets(dados.rg);
    digitacpf();
    validacpf();
    for (x=0;x<11;x++) dados.cpf[x]=cpf[x];
    printf("\n\nAlteracao realizada com sucesso!\n\n");
    fseek(arquivo,sizeof(dados),SEEK_SET);
    fwrite(&dados,sizeof(dados),1,arquivo);
    fclose(arquivo);
    }
    sucess();
}

Editado por steel_sp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...