Ir ao conteúdo
  • Cadastre-se

C Manipulação arquivos ler dados e deletar um dado existente


Felipe Lombardi
Ir à solução Resolvido por devair1010,

Posts recomendados

Olá, estou fazendo um trabalho onde tenho que criar um grupo em um arquivo, eu gero um arquivo.txt e escrevo apenas o nome deles. Exemplo:

João

José

Roberto

Fred

Alfred

A parte que eu não estou conseguindo fazer é remover algum nome específico que o usuário digite. Alguém poderia ajudar nisso?

Segue abaixo minha função que cria o grupo: 

CODE

int cria_grupo () { //cria arquivo com os integrantes do grupo
    FILE *arq;
    
    arq = fopen("grupo.txt", "w");
    
    char integrantes[1001];
    int i, j;
    
    for (j=0; j<=4; j++) {
        fgets(integrantes, 1000, stdin); //insere o integrante na variável    
        for(i=0; integrantes; i++) { 
            fputc(integrantes, arq); //insere o integrante da variável, no arquivo
        }
    }
    
    fclose(arq);
}

 

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

Olá @Felipe Lombardi  tudo bem!?

 

Perceba que é quase impossível editar o arquivo em disco sem sobrescrever o que havia antes da atualização.

 

Então aceitando essa percepção inicial lhe proponho que, primeiro abra o arquivo e coloque todo o seu conteúdo na memória usando para isso estruturas de dados (de tipos simples ou compostos) e os comandos corretos, edite essas estruturas conforme queira e só depois disso atualize os dados sobrescrevendo o arquivo original, e mais uma vez, entenda os comandos corretos para esses procedimentos.

 

Atualmente seu programa parece, para mim, criar e escrever a lista em um arquivo. Entendo que a última parte da resolução você já tem: aquela que sobrescreve o arquivo. Só falta mudar a origem da atualização para um certo procedimento de atualização (Edit: que antes ocorreu na memória).

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

  • Solução

@Felipe Lombardi        pelo que entendi você quer deletar um nome no arquivo ,  então você pode usar um código parecido com esse  :

#include <stdio.h>
#include <conio.h>
#define pausa; for(f=0;f<80000000;f++);
int deletar(char[]);
int cria_grupo(){                             /*cria arquivo com os integrantes do grupo*/
    FILE *arq;
    arq = fopen("grupo.txt","a");             /* tenta abrir o arquivo pa leitura e gravação*/
    if(arq==NULL)                             /* se ele não existir */
        arq = fopen("grupo.txt","w");         /* cria o arquivo e abre ele para gravação */
    char integrantes[1001];                   /* variável com Mil e Hum caracteres */
    int i,j;
    for(j=0; j<5; j++){                       /* repete cinco vezes */
        printf("O %d%c Nome => ",j+1,167);    /* para o usuário saber o que fazer */
        fgets(integrantes, 1000, stdin);      /*insere o integrante na variável*/
        for(i=0; i<strlen(integrantes); i++)  /* limitar o incremento da variável , senão loop infinito e buga tudop */{
            fputc(integrantes[i],arq);        /*insere o integrante da variável, no arquivo, caractere por caractere */
        }
        /*fprintf(arq,"%s\n",integrantes); poderia usar esse fprintf no lugar do fputc , seria melhor */
    }
    fclose(arq);
}
int main(){
    system("color e3");            /* 1º cor tela  2º cor letras */
    char nom[30];
    int f;
    cria_grupo();
    printf("Qual Nome Remover > ");
    gets(nom);                       /* pega uma string com mais de uma palavra */
    deletar(nom);                    /* envia o nome por parâmetro , para a função */
    printf("\n        Tecle !\n\n");
    while( ! kbhit()){
        printf("     |\r");pausa;
        printf("     -\r");pausa;
        printf("     /\r");pausa;
        printf("     %c\r",92);pausa;
    }
    return 0;
}

int deletar(char nom[]){                    /* recebe o nome enviado por parâmetro */
    FILE *arqi, *arqL;                      /* dois arquivos distintos */
    char var[30];                           /* variável string de até trinta caracteres */
    arqi=fopen("grupo.txt","r");            /* tenta abrir o arquivo para leitura */
    if(!arqi){                              /* se o arquivo não existir */
        printf("arquivo inexistente\n\n");  /* informa o fato*/
        return 0;                           /* retorna para a função main principal */
    }
    arqL=fopen("buck_UP.txt","w");          /* cria e abre um arquivo para gravação */
    while(fscanf(arqi,"%s",var)!=EOF){      /* lê o arquivo até o final */
        if(strcmp(nom,var)!=0){             /* se não é o nome procurado */
            fprintf(arqL,"%s\n",var);       /* coloca ele no arquivo de back up */
        }
    }
    fclose(arqL);                     /* ordem de precedencia fecha o segundo arquivo aberto */
    fclose(arqi);                     /* ordem de precedencia fecha o primeiro arquivo aberto */
    remove("grupo.txt");              /* remove aqueler arquivo que tem o nome procurado */
    rename("buck_UP.txt","grupo.txt");/* muda o nome do arquivo que nao tem o nome procurado, para o nome do outro */
    return 0;
}

 

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

@devair1010

Muito bem resolvido (GG 📣)!

 Só um detalhe que vai aparecer em máquinas mais antiquadas sempre

image.png.91d382443c1edba7185113d84cb9a896.png

O marcado de edição vai e volta durante a animação. Para minimizar esse efeito troquei \r por \b.

 

@Felipe Lombardi

A implementação do colega de fórum @devair1010 perpassa o que imaginei para o problema.

Note a existência de uma função (ou procedimento) não só para edição mais também para segurança da informação.

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

A ideia básica do código do @devair1010  é essa:

 

Em 13/08/2018 às 11:07, isrnick disse:

[...] basicamente abre o arquivo original em modo de leitura, e abre um novo arquivo em modo de escrita, aí lê cada registro do arquivo original, e se não for o registro que deseja-se excluir o programa escreve o registro no novo arquivo, assim só o registro excluído não é escrito no novo arquivo.

 

Uma vez concluído esse processo de cópia de todos registros (menos o excluído) e após usar fclose() para fechar os 2 arquivos abertos, basta usar a função remove() para excluir o arquivo original, e depois a função rename() para renomear o novo arquivo para o nome do original, e pronto exclusão do registro concluída.

 


remove("arquivo.bin");
rename("novoarquivo.bin", "arquivo.bin");

(remove e rename são da biblioteca stdio.h)

  • Curtir 1
  • Obrigado 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...