Ir ao conteúdo
  • Cadastre-se

C Procura de chave em arquivo binário (Estrutura de dados)


Leonardo Ely

Posts recomendados

Boa noite galera primeiramente o enunciado do exercício

 

Citação

Faça a implementação de pesquisa binária no arquivo-exemplo apresentado no estudo dos arquivos sequenciais (está nos slides, 17 registros):

1000 Ademar 25 500
1050 Afonso 27 700
1075 Angela 22 600
1100 Antônio 28 850
1300 Carlos 23 750
1350 Cesar 55 900
1400 Claudia 25 800
1440 Cristiano 30 1000
1480 Darci 20 750
1600 Diogo 26 600
1700 Edson 35 500
1800 Eder 26 550
1850 Elias 32 650
1900 Flavio 28 780
1950 Gerson 39 700
1975 Geraldo 34 2500
2000 Helena 42 500

Implemente operações de:

- criação do arquivo

- busca de um registro  a partir de sua chave de acesso, usando pesquisa binária. Imprimir na tela os dados comparados até encontrar (ou não) o registro solicitado.

Anterior

 

Até o momento consegui criar o arquivo, inserir os dados deles e fazer a saída deste arquivo binário. Agora preciso abrir este arquivo e buscar alguma das chaves inserida nele por exemplo a chave 1800. Gostaria de saber como eu faço pra procurar eles dentro do arquivo binário gerado? Não faço ideia de como fazer preciso de ajuda, agradeço desde já!
 

Segue o código atual:
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct
{
    int numero;
    char nome[50];
    int idade;
    int salario;
} dados;
 
size_t gravar_registro( FILE * pf, int numero, char * nome, int idade, int salario )
{
    dados d;
 
    d.numero = numero;
    strcpy( d.nome, nome );
    d.idade = idade;
    d.salario = salario;
 
    return fwrite( &d, sizeof(dados), 1, pf );
}
 
 
int main( int argc, char ** argv )
{
    FILE * arq = NULL;
    
    arq = fopen( "registro.bin", "wb");
 
    if( !arq )
    {
        fprintf( stderr, "Erro ao abrir arquivo para gravacao.\n");
        return EXIT_FAILURE;
    }
 
    gravar_registro( arq, 1000, "Ademar", 25, 500 );
    gravar_registro( arq, 1050, "Afonso", 27, 700 );
    gravar_registro( arq, 1075, "Angela", 22, 600 );
    gravar_registro( arq, 1100, "Antonio", 28, 850 );
    gravar_registro( arq, 1300, "Carlos", 23, 750 );
    gravar_registro( arq, 1350, "Cesaar", 55, 900 );
    gravar_registro( arq, 1400, "Claudia", 25, 800 );
    gravar_registro( arq, 1440, "Cristiano", 30, 1000 );
    gravar_registro( arq, 1480, "Darci", 20, 750 );
    gravar_registro( arq, 1600, "Diogo", 26, 600 );
    gravar_registro( arq, 1700, "Edson", 35, 500 );
    gravar_registro( arq, 1800, "Eder", 26, 550 );
    gravar_registro( arq, 1850, "Elias", 32, 650 );
    gravar_registro( arq, 1900, "Flavio", 28, 780 );
    gravar_registro( arq, 1950, "Gerson", 39, 700 );
    gravar_registro( arq, 1975, "Geraldo", 34, 2500 );
    gravar_registro( arq, 2000, "Helena", 42, 500 );
 
    fclose(arq);
 
    arq = fopen( "registro.bin", "rb");
 
    if( !arq )
    {
        fprintf( stderr, "Erro ao abrir arquivo para leitura.\n");
        return EXIT_FAILURE;
    }
 
    fclose(arq);
 
    return EXIT_SUCCESS;
}

 

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

    return fwrite( &d, sizeof(dados), 1, pf );


Entre essa linha e essa linha 
 

    gravar_registro( arq, 2000, "Helena", 42, 500 );


E essa conclusão

 

14 horas atrás, Leonardo Ely disse:

return EXIT_SUCCESS;

 

Existe muita esperança

 

Como sabe se gravou se não leu depois pra ver o que está lá e se sequer testou o retorno de write() na função ou o retorno da função gravar_registro() em main()?

 

Como foi você que gravou ler é só fazer o contrário: fread() tentando ler o tamanho da estrutura a cada vez. Pode ter problemas de alinhamento porque o sistema inclui bytes extras em alguns lugares, mas vai saber rapidinho e aí volte a perguntar.

 

Sério que teve a paciência de digitar esses dados? Por sorte o enunciado não pedia 200 hein? Não seria mais simples escrever
 

    int N = 500;
    for(int i = 0; i<N; N+=1)
        gravar_registro(arq, (N+i), "Ademar", 25, 500);
    fclose(arq);

 

por exemplo? Assim você teria 500 registros com numero crescente a partir de 500 para ficar mais simples de testar a leitura e ver se não sumiu ninguém ;) 


Em geral não se escrever gravar_registro() assim: se acostume a usar a estrutura como argumento e não TODOS os campos. Sabe o que vai acontecer se descobrir que precisa incluir o CPF na estrutura? vai ter que mudar TODAS as chamadas, uma a uma. E se tivesse escrito
 

    size_t gravar_registro(dados* um_cidadao);


sabe o que precisaria mudar? Nada.
 

 

 

 

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