Ir ao conteúdo
  • Cadastre-se

C Update de uma struct em um arquivo .txt


FgD

Posts recomendados

Olá, estou tendo dificuldades em um código para um trabalho de faculdade. Eu tenho que fazer um código para cadastro/procura/listagem/exclusão de clientes. A parte de cadastro/procura/listagem está pronta, mas estou tendo problemas com a exclusão de um cliente. A minha ideia é a seguinte:
- O usuário irá procurar o cliente que quer deletar pelo seu cpf.

- Adicionei uma variável a struct de cliente chamada "ativo".

- Quando essa variável for 's' o programa vai listar e procurar por esse cliente, e quando essa variável for 'n' o programa vai ignorar esse cliente (dando a impressão de que o cliente foi excluído). O problema é que eu não estou conseguindo alterar essa variável do tipo char do meu .txt.
Segue abaixo a função deletarCliente do meu programa, se possível poderiam apontar meu erro e me ajudar a compreende-lo?

(Caso seja preciso a função de cadastrar o cliente ou/e o arquivo .txt, posso postá-los a seguir)

void deletarCliente(){
    FILE* clientes;
    CLIENTE clt;
    char cpf[15];

    clientes = fopen("clientes.txt", "r+");
    if(clientes == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CLIENTES'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        printf("Digite o CPF do cliente a ser deletado: ");
        scanf(" %s", &cpf);    
        while(fread(&clt, sizeof(CLIENTE), 1, clientes) == 1){
            if(strcmp(cpf, clt.cpf) == 0){
                clt.ativo = 'N';
                fwrite(&clt, sizeof(CLIENTE), 1, clientes);            
            }
        }
        fclose(clientes);
        getch();
    }
}

 

Link para o comentário
Compartilhar em outros sites

Tente assim:

void deletarCliente(){
    FILE* clientes;
    CLIENTE clt;
    char cpf[15];
    long pos;

    clientes = fopen("clientes.txt", "r+");
    if(clientes == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CLIENTES'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        printf("Digite o CPF do cliente a ser deletado: ");
        scanf(" %s", &cpf);
        pos = ftell(clientes);
        while(fread(&clt, sizeof(CLIENTE), 1, clientes) == 1){
            if(strcmp(cpf, clt.cpf) == 0){
                clt.ativo = 'N';
                fseek(clientes, pos, SEEK_SET);
                fwrite(&clt, sizeof(CLIENTE), 1, clientes);            
            }
            pos = ftell(clientes);
        }
        fclose(clientes);
        getch();
    }
}

Basicamente fiz ele guardar a posição antes de ler a struct (com ftell), e se os dados lidos forem referentes ao cliente a ser excluído ele volta para a posição anterior para poder sobrescrever esta entrada com os novos valores.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

45 minutos atrás, isrnick disse:

Tente assim:


void deletarCliente(){
    FILE* clientes;
    CLIENTE clt;
    char cpf[15];
    long pos;

    clientes = fopen("clientes.txt", "r+");
    if(clientes == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CLIENTES'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        printf("Digite o CPF do cliente a ser deletado: ");
        scanf(" %s", &cpf);
        pos = ftell(clientes);
        while(fread(&clt, sizeof(CLIENTE), 1, clientes) == 1){
            if(strcmp(cpf, clt.cpf) == 0){
                clt.ativo = 'N';
                fseek(clientes, pos, SEEK_SET);
                fwrite(&clt, sizeof(CLIENTE), 1, clientes);            
            }
            pos = ftell(clientes);
        }
        fclose(clientes);
        getch();
    }
}

Basicamente fiz ele guardar a posição antes de ler a struct (com ftell), e se os dados lidos forem referentes ao cliente a ser excluído ele volta para a posição anterior para poder sobrescrever esta entrada com os novos valores.

Adicionei aqui ao programa e funcionou sim. Muito obrigado!
Eu sou novo ainda na programação em C, então estou lutando pra aprender a linguagem haha
valeu mesmo!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...