preciso de ajuda com arquivos em C

1. preciso de ajuda com arquivos em C

luiz eduardo da rocha oliveira
luiz555

(usa Ubuntu)

Enviado em 15/10/2016 - 09:39h

pessoal estou com um problema em trabalhar com arquivo em c pois ele cadastra tudo normalmente mas na hora de buscar o usuário cadastrado fala que não encontrou. se eu fechar e executar o código novamente e buscar pelo o mesmo usuário ele encontra normalmente o que pode ser?

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


FILE*aseguro;

typedef struct{
int cpf1,cpf2,idade,sexo,dnasc1,dnasc2,tveiculo1,tveiculo2,tel,anofab1,anofab2,opcad;
char nome1[50],nome2[50],cor1[50],cor2[50],placa1[50],placa2[50],mveiculo1[50],mveiculo2[50],email1[50],email2[50];
float vseguro;
}Tseguro;
Tseguro rseguro;

void abrearquivo(){
aseguro=fopen("data.txt","r+b");
if(aseguro==NULL){
aseguro=fopen("data.txt","w+b");
}
}

void cadastro(){
int op,p1,p2;
setlocale(LC_ALL,"");
linha();
printf("\n================================CADASTRO========================================\n");
do{
printf("informe o cpf:");
scanf("%d",&rseguro.cpf1);
printf("informe o nome:");
fflush(stdin);
gets(rseguro.nome1);
printf("informe o sexo 1-H/2-M:");
scanf("%d",&rseguro.sexo);
printf("informe idade:");
scanf("%d",&rseguro.idade);
printf("informe o email:");
fflush(stdin);
gets(rseguro.email1);
printf("informe a data de nascimento:");
scanf("%d",&rseguro.dnasc1);
printf("informe o telefone:");
scanf("%d",&rseguro.tel);
printf("\ndeseja cadastrar um dependente? 1-SIM/2-NÃO:");
scanf("%d",&p1);
if(p1==1){
printf("informe o cpf(dependente):");
scanf("%d",&rseguro.cpf2);
printf("informe o nome:(dependente)");
fflush(stdin);
gets(rseguro.nome2);
printf("informe a data de nascimento(dependente):");
scanf("%d",&rseguro.dnasc2);
printf("\ndependente cadastrado com sucesso.");
}
printf("\ntipo veiculo 1-Moto / 2-Carro P Porte / 3-Carro M Porte / 4-Carro G Porte:");
scanf("%d",&rseguro.tveiculo1);
printf("informe o modelo do veiculo:");
fflush(stdin);
gets(rseguro.mveiculo1);
printf("informe a cor do veiculo:");
fflush(stdin);
gets(rseguro.cor1);
printf("informe o ano de fabricação do veiculo:");
scanf("%d",&rseguro.anofab1);
printf("informe a placa do veiculo:");
fflush(stdin);
gets(rseguro.placa1);
printf("\ndeseja cadastrar outro veiculo? 1-SIM/2-NÃO:");
scanf("%d",&p2);
if(p2==1){
rseguro.opcad=2;
printf("\n tipo veiculo 1-Moto / 2-Carro P Porte / 3-Carro M Porte / 4-Carro G Porte");
scanf("%d",&rseguro.tveiculo2);
printf("informe o modelo do veiculo:");
fflush(stdin);
gets(rseguro.mveiculo2);
printf("informe a cor do veiculo:");
fflush(stdin);
gets(rseguro.cor2);
printf("informe o ano de fabricação do veiculo:");
scanf("%d",&rseguro.anofab2);
printf("informe a placa do veiculo:");
fflush(stdin);
gets(rseguro.placa2);
}
printf("\ncliente cadastrado com sucesso.");
rseguro.vseguro=calculomens(rseguro.tveiculo1,rseguro.opcad,rseguro.tveiculo2,rseguro.idade,rseguro.sexo);
//posiciona o ponteiro e grava os dados
fseek(aseguro,0,SEEK_END);
fwrite(&rseguro,sizeof(Tseguro),1,aseguro);
printf("cliente %s cadastrado com sucesso",rseguro.nome1);
printf("\ndeseja cadastrar outro cliente? 1-SIM/2-NÃO:");
scanf("%d",&op);
if(op==1){
limpar();
}else{
limpar();
menu();
}
}while(op!=2);
}



int busca(int cp){
int posicao = 0;

rewind(aseguro);
fread(&rseguro, sizeof(Tseguro), 1, aseguro);

while(feof(aseguro)==0){
if(rseguro.cpf1==cp){
return posicao;
}else{
fread(&rseguro, sizeof(Tseguro), 1, aseguro);
posicao++;
}
}

return -1;
}

void teste(){
int opc2,cpfr,bus;
do{
printf("informe o cpf do cliente:");
scanf("%d",&cpfr);
bus=busca(cpfr);
if(bus==-1){
printf("cliente não encontrado");
}else{
printf("\nnome do cliente %s",rseguro.nome1);
}
printf("\ndeseja procurar outro cliente? 1-SIM/2-NÃO:");
scanf("%d",&opc2);
if(opc2==1){
limpar();
}else{
limpar();
menu();
}
}while(opc2!=2);
}

void menu(){
int escolha;
abrearquivo();
setlocale(LC_ALL,"");
do{
printf("\n1-Cadastrar");
printf("\n2-Sair");
printf("\n3-teste busca");
printf("\nescolha uma opção:");
scanf("%d",&escolha);
limpar();
switch(escolha){
case 1:cadastro();break;
case 2:fclose(aseguro);break;
case 3:teste();break;
}
}while(escolha!=2);
}

main(){
menu();
getche();
return 0;
}

está ai o código que fiz ate agora.
agradeço desde já qualquer ajuda.
ps uso gets pois a professora que pede para usar.


  


2. Re: preciso de ajuda com arquivos em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2016 - 09:53h

Por favor, melhore a formatação da sua postagem, pois do jeito como está acaba ficando muito difícil de ler. Lembre-se de colocar seu código compreendido entre as tags “[code]” e “[/code]”.

Pelo pouco que eu vi do código, notei a presença de coisas meio estranhas, como gets(), “fflush(stdin)”, declaração de main() sem especificar tipo de retorno, e uma função getche() que não é definida e nem mesmo declarada em lugar nenhum. Para cada uma dessas coisas, existe uma solução mais adequada e usando apenas os recursos padronizados da linguagem e da biblioteca.

Outras coisas esquisitas:

    - int para representar o CPF (o CPF mesmo tem onze dígitos, o que não cabe num inteiro de 32 bits);

    - Você não testa se as operações de leitura foram bem sucedidas. Isso é importante, especialmente com scanf().

    - Muito importante também é testar se a chamada a fwrite() funcionou.

    - menu() chama cadastro() e cadastro() chama menu(). Isso está errado, e cedo ou tarde você vai ficar sem espaço de pilha. Lembre-se que menu() roda em loop.


Mas provavelmente o seu problema é a inversão da condição do loop de leitura: você diz para ele repetir enquanto encontrar o fim do arquivo -- deveria ser enquanto não o encontrar.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts