Ir ao conteúdo

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


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
Postado

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
  • Solução
Postado

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

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

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!