Ir ao conteúdo
  • Cadastre-se
Elyton Moreira

Como pesquisar e deletar um registro que esteja armazenado no arquivo.

Recommended Posts

eu fiz o codigo só que falta 2 funçoes  para acabar o trabalho 

os 2 requisitos faltando sao

 

1)Deletar um registro do arquivo. O usuário deverá escolher o valor do código do registro a ser excluído.
2)Pesquisar um registro que esteja armazenado no arquivo. O usuário deverá escolher o valor do código do registro a ser pesquisado.
Caso o registro seja encontrado no arquivo, deverá ser mostrada uma mensagem com os dados do registro, caso contrário, deverá ser mostrada a mensagem “registro não encontrado no arquivo”.

 

codigo abaixo por favor ajudem please

 


 

#include <stdio.h>
#include <stdlib.h>
int menu;
typedef struct midia{
    char nome[30],genero[30],tipo[30],codigo[30],anolancamento[30];
    
}dados;
int cadastrar(){
    struct midia;
    dados locadora;
    setbuf(stdin,NULL);
    printf("digite seu nome: ");
    gets(locadora.nome);
    setbuf(stdin,NULL);
    printf("digite o genero: ");
    scanf("%s",&locadora.genero);
    setbuf(stdin,NULL);
    printf("digite o tipo DVD OU BLURAY: ");
    scanf("%s",&locadora.tipo);
    setbuf(stdin,NULL);
    printf("digite o ano de lancamento: ");
    scanf("%s",&locadora.anolancamento);
    setbuf(stdin,NULL);
    printf("digite o codigo: ");
    scanf("%s",&locadora.codigo);
    FILE *arquivo=fopen("dados.txt","a");
    if(!arquivo) exit(1);
    fprintf(arquivo,"nome: %s\n",locadora.nome);
    fprintf(arquivo,"genero: %s\n",locadora.genero);
    fprintf(arquivo,"tipo: %s\n",locadora.tipo);
    fprintf(arquivo,"ano do lancamento: %s\n",locadora.anolancamento);
    fprintf(arquivo,"codigo: %s\n \n",locadora.codigo);
    
    
    fclose(arquivo);
    printf("cadastro realizado com sucesso \n");
}
int pesquisar(){
    
    
    
    
        printf("Nome nao encontrado\n");
    
     printf("\n----------------------------------------------------------\n\n");
}
int deletar(){
    
    
}
int excluirtodos(){
    int op;
    printf("Deseja Realmente excluir todos? \n [1-Sim ou 2-nao]: ");
    scanf("%d",&op);
    if (op == 1){
        struct  midia;
        FILE * arquivo;
        arquivo = fopen("dados.txt","w");
        printf("Todos excluidos com Exito!");         
        fclose(arquivo);
    }
    getch();
}
main(){
    do{ 
        printf("\n================ MENU ====================\n");
        printf("1 - Cadastrar\n");
        printf("2 - Pesquisar\n");
        printf("3 - Deletar registro --- falhando ---------- \n");
        printf("4 - limpar arquivo\n");
        printf("0 - Sair\n");
        printf("====================================");
      
        printf("\nDigite a alternativa desejada: ");    
        scanf("%d",&menu); 
      
        if(menu==1){ // LISTA PARA CADASTRAR
            cadastrar();        
        }
        if(menu==2){ // LISTA PARA PESQUISAR OS REGISTROS
            pesquisar();        
        }
        if(menu==3){
            deletar(); //FUNÇÃO EXCLUIR REGISTRO
        }
        if(menu==4){
            excluirtodos(); // FUNÇÃO limpar REGISTRO
        }
    }
    while(menu!=0);          
    getch();
    system("pause");
    return 0;
}

 

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

É meio complicado por não dizer impossível. você pode até zerar o tal dado mas não poderá eliminar o espaço, ficaria o espaço vazio. Um arquivo parece muito com um parking, você retira o carro mas a vaga está lá para depois ser ocupada por outro carro.


Vamos imaginar que no nosso arquivo temos:
carro1
carro2
carro3

Se eu eliminar o carro 2 seu arquivo vai ficar:
carro1

carro3

Não sei se deu para entender.

Então teoricamente você pode borrar o dado porém o espaço continua lá. O que você pode fazer é passar o arquivo a outro arquivo eliminando o dado que você quiser... isso se chama otimizar.

Para fazer isso que você quer, é necessário buscar "como ler arquivos de acesso aleatório" para por exemplo, ler uma linha completa onde pode estar seu dado, porém anotando onde ela inicia com ftell para depois que você averiguar que a linha coincide com sua pesquisa, posteriormente se retorna ao inicio da linha com fseek e se aplica a modificação desejada. porém como falei o único que você poderia fazer é zerar os dados "marcando" como "disponivel" para outro dado que necessite um espaço.

Não existe nenhuma regra para arquivos, você é quem deve desenvolver a lógica usando as funções para ficheiros conforme sua necessidade.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp Eu consegui fazer a função "Pesquisar" com colegas na faculdade, só ficou faltando essa função "excluir" nao consigo fazer de jeito nenhum :/

Editado por Elyton Moreira

Compartilhar este post


Link para o post
Compartilhar em outros sites

É muito difícil explicar todos os conceitos que você precisa por um fórum. Então preparei um exemplo "simples" do que você teria que fazer.

Imagine que você tem um arquivo como esse: prova.txt

O arquivo tem 3 linhas dessa forma:
linha1
linha2
linha3

Imagine que quero borrar linha2 deixando ele dessa forma:
linha1

linha3
 

O código seria esse:
 

#include<stdio.h>
#include <locale.h>
#include <string.h>


int main(void){
    setlocale(LC_ALL, "portuguese-brazilian");
    
    //abrimos o arquivo e comprovamos se foi aberto
    FILE *file = fopen("prova.txt", "r+");
    if( !file ){
        perror("Erro: ");
        getchar();
        return 1;
    }
    
    //variaveis que vamos usar
    char buffer[1204]; //Buffer que vai guardar uma linha do arquivo por vez
    char pesquisa[100] = "linha2";  //O que pretendo buscar no arquivo
    long int inicioLinha=0;        //variavel que vai indicar onde começa a linha antes de ler
    
    inicioLinha = ftell( file ); //preste atenção. Antes de ler uma linha devemos anotar o primeiro caractere da linha, isso é o que faz essa linha, ftell guarda em inicioLinha quantos bytes tem desde o inicio do arquivo até o inicio da linha.
    while ( fscanf(file, "%s%*c", buffer) != EOF ){ // Como o programa começa na linha zero inicioLinha começa sendo 0, agora fscanf le a linha e o que foi lido vai parar no buffer. O fscanf para na seguinte linha antes de uma nova leitura, porém devemos comprovar primeiro se o que tem na linha é o que andamos buscando.
        
        //Comparamos o que foi lido com o objetovo da pesquisa
        if ( strcmp( buffer, pesquisa ) == 0  ){
            // Se entramos aqui é por que buffer é igual a pesquisa
            printf ("Encontrado!\n");
            
            //Agora nesse ponto devemos fazer o que queremos... borrar o conteudo.
            printf("No buffer tem: %d letras.\n", strlen(buffer)); //Para borrar o conteudo devemos primeiro saber quantas letras tem
            int TAM = strlen(buffer); //guardamos o tamanho em uma variavel.
            
            //Agora preste atenção novamente devemos voltar ao inicio da linha para poder borrar TAM letras. Para isso usamos fseek
            fseek(file/*no arquivo...*/, inicioLinha/*queremos ir ao inicio da linha...*/, SEEK_SET/*e queremos fazer desde o inicio para o fim*/); // fseek bota o ponteiro X bytes desde o inicio do arquivo e para direitinho ao inicio da linha.
            

            //Agora escrevemos TAM bytes com espaços(borrado! A linha fica em branco)
            int i;
            for (i=0; i<TAM ;i++ ) {
                putc((int)' ', file);    
            }
            
            //TADAH!!!
            //usamos break para sair
            break;
        }
        
        inicioLinha = ftell( file );  //Se não encontrou necessotamos continuar lendo linhas... então anotamos outravez o inicio da seguinte linha antes de começar tudo de novo.
    }
    
    fclose(file);
}

Tentei comentar o máximo não gosto de carregar tanto de comentário, porém não sei seu nível, se tiver duvidas pergunte.

Você deve praticar mais com arquivos, só assim você pegará a pratica, não espere seu professor pedir trabalhos, vai na luta vei.
Prove fazer vários tipos de CRUD... aluguel de filmes, gestão de bibliotecas, contas de bancos, etc.

Basicamente é começar a ler o arquivo pelo inicio... linha zero.

O que fazemos todo o tempo é:
-Anotar onde começa a linha.
-Ler a a linha. O cursor vai se deter na seguinte linha.
-A linha que lemos comparamos com o que estamos buscando
-Se encontramos...

  1. voltar ao principio da linha
  2. obter o tamanho dos dados a sobrescrever
  3. sobrescrever
  4. sair do laço com um break(pergunte se seu professor permite usar essa opção, tem professores muito chatos >_<)

-Se não repetimos tudo novamente até encontrar o que buscamos ou até atingir o fim do arquivo, nesse caso quer dizer que não encontramos.

 

Editado por vangodp
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra maneira seria criar um outro arquivo (ex: "dados_new.txt"), salvar nele todos os dados do arquivo original exceto os dados do cadastro que você deseja excluir, então excluir o arquivo original ( remove("dados.txt"); ), e renomear o novo arquivo para substituir o arquivo original ( rename("dados_new.txt", "dados.txt"); ).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp seu codigo nao funcionou aqui porque o professor queria no anunciado do trabalho informar o codigo do registro para ser apagado 

adicionado 2 minutos depois

Eu cadastrei 3 usuario, mas na hora de abrir menu excluir nao apareceu a opção "informe o codigo a ser excluido "

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, isrnick disse:

Outra maneira seria criar um outro arquivo (ex: "dados_new.txt"), salvar nele todos os dados do arquivo original exceto os dados do cadastro que você deseja excluir, então excluir o arquivo original ( remove("dados.txt"); ), e renomear o novo arquivo para substituir o arquivo original ( rename("dados_new.txt", "dados.txt"); ).

Sim seria uma alternativa. porém ja imaginou fazer isso com toda a BD do google ou facebook para cara usuário? Para um só você precisaria ter o dobro de memória disponível, não acho que seja rentável ao contratante. Certamente fazem otimizações cada X tempo mas não para borrar dados.
Será essa a causa que nunca nos eliminam completamente do sistema? >_<
 

adicionado 3 minutos depois
1 hora atrás, Elyton Moreira disse:

@vangodp seu codigo nao funcionou aqui porque o professor queria no anunciado do trabalho informar o codigo do registro para ser apagado 

adicionado 2 minutos depois

Eu cadastrei 3 usuario, mas na hora de abrir menu excluir nao apareceu a opção "informe o codigo a ser excluido "

Posso lhe assegurar que sim funciona... outra coisa diferente é que você esteja esperando alguém resolver por você o problema.

Editado por vangodp
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, vangodp disse:

Sim seria uma alternativa. porém ja imaginou fazer isso com toda a BD do google ou facebook para cara usuário? Para um só você precisaria ter o dobro de memória disponível, não acho que seja rentável ao contratante. Certamente fazem otimizações cada X tempo mas não para borrar dados.
Será essa a causa que nunca nos eliminam completamente do sistema? >_<
 

Sim, acredito que esse é o motivo pelo qual os dados nunca são eliminados do sistema, porque é mais fácil apenas criar um campo extra pra cada registro que designa se o registro é acessível ou não, e fazer o algoritmo de consulta ao banco de dados apenas ignorar os registros não acessíveis (=excluídos), então os dados ainda estão todos lá no BD só não podem mais ser acessados (pelos meios mais práticos)...

 

Aí teria um algoritmo parecido com o seu mas para mudar o valor de apenas um campo do registro de TRUE pra FALSE (1 para 0 por exemplo) para indicar que esse registro não deve ser acessado. Mas o correto seria realmente otimizar o banco de dados periodicamente eliminando de fato os registros não acessíveis...

 

Mas quanto ao uso de memória existem várias maneiras de minimizar isto, uma simples seria dividir o BD em vários arquivos diferentes com um tamanho máximo e/ou um dado número máximo de registros em cada um.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

função "pesquisar" fiz assim 

 

int pesquisar(){
    char leitor [50],str1[20],str2[20],cod[30];
    int i=0,j=0;
    FILE*arquivo=fopen("dados.txt","r");
    if(arquivo==NULL)exit(1);
    setbuf(stdin,NULL);
    printf("pesquisar codigo:");
    scanf("%s",cod);
    while(fgets(leitor,50,arquivo)){
        sscanf(leitor,"%s %s",str1,str2); // 'sscanf' string que divide em outras string
        if(strcasecmp(str2,cod)==0)i+=1;
        if(i>=1){
            if(i>=1&&j<=4)printf("%s \n",leitor);
            j++;
        }
    
    }
    if(i>=1){
        printf("registro encontrado \n");
        
    }else if(i==0){
        printf("registro nao encontrado \n");
    }
    fclose(arquivo);
}
 

 

E funcionou tranquilo 

 

alguém ajuda na função deletar registro :/

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, isrnick disse:

Mas quanto ao uso de memória existem várias maneiras de minimizar isto, uma simples seria dividir o BD em vários arquivos diferentes com um tamanho máximo e/ou um dado número máximo de registros em cada um.

sim... tambem é vero >_<

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×