Ir ao conteúdo

Posts recomendados

Postado

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();
    }
}

 

Postado
4 horas atrás, TYSQUARE89 disse:

@Fabio Guimarães Dionisio poderia descrever o que acontece quando tenta mudar a váriavel?

Quando eu crio um cliente, eu defino ela como sendo "char ativo = 'S'", e uso a função acima para tentar modificar ela para 'N'. Mas ela permanece sendo 'S'.

Postado

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

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