Jump to content
NASG

Ficheiros& estruturas

Recommended Posts

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);}

Edited by pmg
GeSHi

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Edited by pmg
GeSHi

Share this post


Link to post
Share on other 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).

Edited by 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.