Jump to content

Ficheiros& estruturas


Recommended Posts

Posted (edited)

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 NASG
GeSHi
Posted

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!

Posted (edited)

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 NASG
GeSHi
Posted (edited)

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!

Posted

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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.