Ir para o conteúdo
NASG

Ficheiros& estruturas

Mensagens Recomendadas

NASG

Bom dia a todos,

estou a tentar fazer um programa que me permita escrever num ficheiro oque for digitando numa estrutura, e depois possa imprimir isso no ecran.

Ja verifiquei que o programa cria o ficheiro em binário, e que escreve qualquer coisa, mas quando peço para imprimir apenas vejo carateres e não o que digitei. Pelo menos parece-me que cria o registo com sucesso uma vez que envia a mensagem Registo criado com sucesso.

Alguem pode ajudar ?

Obrigado desde já.

Função para ler o que escrevo:

void ler_registo(veiculo_t *v)    // Funcao que vai ler o registo de veiculos
{

char copia[6];

       printf("Insira Nome do proprietario:\n");
       fgets(v->prop,MAXPLEN,stdin);            
       printf("Insira Matricula:\n" );
       fgets(copia,6,stdin);
       memcpy(v->mat,copia,6); // numero de Bytes a copiar para a matricula, 6*1 Byte.
       printf("insira valor comercial do automovel em Euros:\n"); //Double ocupa 8 Bytes
       fgets(copia,10,stdin);
       sscanf(copia,"%lf",&(v->valor));
       fflush(stdin);        
}

funcao para imprimir

void imprimir_registo(veiculo_t *v)

{
    printf ("---Registo Automovel---\n\n");
    printf("O nome do proprietario do registo:""%s\n",v->prop);
    printf("\nmatricula nro:\n ");
    fwrite(v->mat,sizeof(*v->mat),7,stdout);
    printf("\nO valor do Veiculo e:""%.2lf\n",v->valor);
}

MAIN

   switch(opcao_menu)
   {
     case 1: {ler_registo(&v1);
             fp=fopen("Registo_veiculos.dat", "a+b");
                       if(fp==NULL){
                       printf("\nNao foi possivel abrir o ficheiro. \n");
                       exit(1);
                         if(fseek(fp,0L,SEEK_SET)!=0);
                         printf("\nErro de posicionamento\n");}
                       else{
                       fwrite(&v1,sizeof(veiculo_t),1,fp);
                       printf("\nRegisto gravado com sucesso\n");
                       fclose(fp); }
                         }
         break;

     case 2:{fp=fopen("Registo_veiculos.dat", "r+b");
             if(fp==NULL){
             printf("\nNao foi possivel abrir o ficheiro. \n");
             exit(1);}  
             else{
             fread(&v1,sizeof(veiculo_t),1,fp);
             //printf("CHEGUEI AQUI\n");
             imprimir_registo(&v1);
             fclose(fp);}

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

No case 1, imediatamente depois de leres 1 registo, imprime-o para verificar se foi bem lido.

No teu primeiro snippet tens um array com 6 elementos, e fazes fgets() para esse mesmo array. Se tudo correr bem, 5 desses 6 elementos vao ficar preenchidos com dados do utilizador e o sexto byte fica com '\0'. Depois copias esses 6 bytes para v->mat que finalmente é escrito no ficheiro.

Ao imprimir os dados assumes que o tal v->mat tem 7 bytes???

Nota: a instrucao fflush(stdin); nao faz a mesma coisa em todas as implementacoes de C. Nalgumas implementacoes pode ate crashar o programa.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NASG

Bom dia,

Obrigado desde já pela resposta, ja consegui por o programa a funcionar, mas não como queria, ou seja queria pedir o valor ao utilizador, passar isso para a funcao fgets e depois usar o sscanf, mas por alguma razão quanto tento implementar isso o programa aparece-me com um numero muito longo onde tento colocar o valor.

TIPO O VALOR É 5730654398756563234444000000000000000000000000000000000000000000.00, alguem me pode dizer se estou a implementar a função fgets seguido de um sscanf() de forma correcta?

void ler_registo(veiculo_t *v)    // Funcao que vai ler o registo de veiculos
{ 

char copia2[17];


printf("\ninsira valor comercial do automovel em Euros:\n"); 
fgets(copia2,15,stdin);    // copia do teclado para a variavel copia os 15 caracteres
sscanf(copia2,"%.2lf",&(v->valor));//sscanf(line, "%lf", &value); copia para estrutura . valor  oq eues estiver em copia. 

}

Obrigado

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

1) liga os warnings do teu compilador

2) a especificacao "%.2lf" nao é valida (o ponto nao esta descrito como parte da especificacao)

3) a especificacao "%lf" (com ou sem coisas extra validas, entre o % e o l) requer um ponteiro para double. Quase de certeza que o v->valor é de tipo float. Os warnings deviam avisar-te disto :)

PS: para escrever codigo aqui no forum, mete-lhe [ code=c ] sem os espacos antes e [ /code ] depois (claro, tambem sem os espacos).

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
NASG

Bom dia,

o v.valor é mesmo do tipo float, diz no traballho, mas de qualqur forma, esqueci este fgets seguido de um sscanf para receber apenas valor com um scanf e ta a funcionar.

obrigado pela ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.