Dúvida em pesquisar em arquivo [RESOLVIDO]

1. Dúvida em pesquisar em arquivo [RESOLVIDO]

Talles Fernando Silva
inluxbdx

(usa Ubuntu)

Enviado em 10/06/2015 - 10:33h

Bom dia galera,

Estou tentando desenvolver um programa, que leia um arquivo.bin de funcionários e que solicite a matrícula de cada funcionário e verifique registro a registro no arquivo, se a matrícula existe e solicite uma atualização de salário.

Após ler o arquivo e salvar em uma struct de vetor, uso a função fseek para posicionar o arquivo no início. Depois coloco um for para percorrer a struct, e verificar se existe o registro. O problema é que, se a matrícula estiver no final do arquivo, ele percorre todo o for e retorna que não encontrou e depois que encontrou.

Será que alguém poderia me ajudar por favor a melhorar esse código? No enunciado do exercício, é solicitado que seja feita uma atualização interativamente.

#include <stdio.h>
#include <stdlib.h>


#define N sizeof(tipoDadosFunc)

typedef struct {
int matric;
char depto[30], nome[30];
float sal;
} tipoDadosFunc;

int main(){

int i = 0;
int cont = 0;
int mat;
tipoDadosFunc funcionario[N];


FILE* fp;

fp = fopen("salario_atualizado.bin", "rb");


if(fp==NULL){
printf("Erro ao abrir o arquivo\n");
exit(EXIT_FAILURE);
}


cont = fread(&funcionario, sizeof(tipoDadosFunc),sizeof(tipoDadosFunc),fp);
fseek(fp,0, SEEK_SET);

printf("%d \n", cont);
printf("Digite sua matrícula: \n");
scanf("%d", &mat);

for(i=0;i<cont;i++){
if(funcionario[i].matric == mat)
printf("Digite o valor do salário \n");
scanf("%f", &funcionario[i].sal);
} else{
printf("Não encontrado \n");
}
}
return 0;

}


  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 10/06/2015 - 11:45h

inluxbdx escreveu:

Nossa, realmente, havia me esquecido dessa função. Daí depois posso passar o for no vetor e fazer a pesquisa binária pra encontrar o valor e atualizar, correto?

Correto, mas faça antes da verificação da matrícula.

Você diz sobre o contador, o cont receber o retorno de quantos registros foram lidos no fread?

Sim, até agora estava testando, mas eu preciso sair agora, mais tarde eu volto, e se não estiver resolvido ainda, irei te ajudar.

Espero ter ajudado

Se ajudei, marque o tópico como resolvido e clique em melhor resposta.

[]'s

T+

--

Programador encontrado morto na banheira cinco dias após ter sido dado como desaparecido. Junto a ele foi encontrado um shampoo com as seguintes instruções:

LAVAR;
ENXAGUAR;
REPETIR;



3. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 10/06/2015 - 11:07h

Amigo, como está o arquivo .bin?

Com ele ficará mais fácil para te ajudar.

[]'s

T+

--

Programador encontrado morto na banheira cinco dias após ter sido dado como desaparecido. Junto a ele foi encontrado um shampoo com as seguintes instruções:

LAVAR;
ENXAGUAR;
REPETIR;




4. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Fernando Eckhardt Valle
pherde

(usa Slackware)

Enviado em 10/06/2015 - 11:08h


Olha pra melhorar o desempenho da pesquisa (e assim não precisar percorrer todo o vetor) sugiro que você pesquise por "Pesquisa Binária".


5. Re: Dúvida em pesquisar em arquivo

Talles Fernando Silva
inluxbdx

(usa Ubuntu)

Enviado em 10/06/2015 - 11:11h

Eu fiz o cadastro de três funcionários somente, para testar, mas no caso da pesquisa, seria até o i= cont, que recebe a quantidade de registros dentro do arquivo.


Matrícula: 900 Departamento: TI Nome: Talles Salário: 500.000000

Matrícula: 800 Departamento: Ti Nome: Talles Salário: 800.000000

Matrícula: 1000 Departamento: Ti Nome: Juca Salário: 1000.000000

Opa, foi mal, no caso acima é como é printado na tela.

O arquivo bin, que tó lendo,
900
Ti
Talles
500

800
Talles
Ti
800

1000
Ti
Juca
10000


6. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 10/06/2015 - 11:31h

Amigo, poderia tentar algo como:


fscanf(fp,"Matricula: %d Departamento: %s Nome: %s Salario: %f",\
&funcionario[i].matric,funcionario[i].depto,funcionario[i].nome,&funcionario[i].sal);


Assim pegará os valores e colocará no vetor;

Espero ter ajudado

[]'s

T+

--

Programador encontrado morto na banheira cinco dias após ter sido dado como desaparecido. Junto a ele foi encontrado um shampoo com as seguintes instruções:

LAVAR;
ENXAGUAR;
REPETIR;




7. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 10/06/2015 - 11:36h

Malz, eu me baseei pelo seu ultimo post, deve ter modificado ele enquanto eu digitava.

Mas ficará algo assim:


fscanf(fp,"%d\n%s\n%s\n%f",\
&funcionario[i].matric,funcionario[i].depto,funcionario[i].nome,&funcionario[i].sal);


Agora só arrume a verificação do tamanho, pois está errada!

Espero ter ajudado

[]'s

T+

--

Programador encontrado morto na banheira cinco dias após ter sido dado como desaparecido. Junto a ele foi encontrado um shampoo com as seguintes instruções:

LAVAR;
ENXAGUAR;
REPETIR;




8. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Talles Fernando Silva
inluxbdx

(usa Ubuntu)

Enviado em 10/06/2015 - 11:43h

Nossa, realmente, havia me esquecido dessa função. Daí depois posso passar o for no vetor e fazer a pesquisa binária pra encontrar o valor e atualizar, correto?

Você diz sobre o contador, o cont receber o retorno de quantos registros foram lidos no fread?




9. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Talles Fernando Silva
inluxbdx

(usa Ubuntu)

Enviado em 10/06/2015 - 12:58h


Thihup,

Deu certo! Muito obrigado pela ajuda!


10. Re: Dúvida em pesquisar em arquivo [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/06/2015 - 23:46h

Eu sei que já até se deu o tópico por encerrado, mas não posso deixar de notar que a solução de ler com scanf() é incompatível com algumas dicas dadas na exposição do problema original, que sugerem que se está trabalhando com um arquivo binário. Contribuem para essa impressão o sufixo ".bin"no nome do arquivo, o modo de abertura "rb" e o uso de fread() para a leitura e o fato de ter de se fazer a atualização dos salários interativamente (o que eu entendo como sobrescrever no próprio arquivo os registros que tiverem de ser alterados, o que é mais fácil de fazer com registros de tamanho fixo do que com arquivo de texto).

Por outro lado, a forma como fread() fora usada estava completamente errada, com divergência entre o tipo do ponteiro do primeiro argumento e os valores usados no segundo e no terceiro. Também a menção a estrutura de vetores estava errada, pois o que se tinha era um vetor de estruturas. O laço de repetição trabalhava exclusivamente em memória, e não com o arquivo. Por fim, o formato em que é mostrado o conteúdo do arquivo parece com arquivo de texto (se bem que eu não sei se a resposta ao pedido feito pelo Thiago de mostrar o arquivo foi só para dar uma ideia do que há nele ou se é uma transcrição literal do seu conteúdo).

Uma receita simples e geral é: se o arquivo tiver sido gerado com fwrite(), ele deve ser lido com fread(), e ambas as funções requerem modo binário no momento da abertura do arquivo; se gerado com funções de escrita de texto, como fprintf() e fputs() (ou construído com um editor de texto puro, como o vim ou o Notepad do Windows), deve ser lido com funções de leitura, como [i]fscanf() e fgets(), e o arquivo deve ser aberto em modo texto. Se for um arquivo de texto, não é possível ler todos os registros do array de uma vez só, e será necessário ler registro por registro (ou, na verdade, campo por campo), até se chegar ao final do arquivo, contando os registros um a um, para saber a quantidade deles que há no arquivo.

A lógica de identificação e informação sobre a busca do registro desejado estava errada. Só se deveria imprimir que o registro não foi encontrado uma vez, depois de ter saído do laço de repetição sem ter encontrado o registro que se queria.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts