Guest NASG Posted March 26, 2013 at 05:33 PM Report #500504 Posted March 26, 2013 at 05:33 PM (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 March 26, 2013 at 06:27 PM by NASG GeSHi
pmg Posted March 26, 2013 at 06:41 PM Report #500516 Posted March 26, 2013 at 06:41 PM 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!
Guest NASG Posted March 26, 2013 at 10:49 PM Report #500537 Posted March 26, 2013 at 10:49 PM (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 March 26, 2013 at 10:58 PM by NASG GeSHi
pmg Posted March 26, 2013 at 11:13 PM Report #500539 Posted March 26, 2013 at 11:13 PM (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 March 26, 2013 at 11:14 PM 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!
Guest NASG Posted March 28, 2013 at 09:14 PM Report #500757 Posted March 28, 2013 at 09:14 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now