Krazzi 0 Denunciar mensagem Publicado 13 de Janeiro de 2010 Boas. Tou com um problema que necessito corrigir urgentemente int ler_ficheiro(RESERVA *reservas) { FILE *fp; char fich[NOMES]; int i = 0; fprintf(stdout, "Introduza o nome do ficheiro: "); fscanf(stdin," %s",fich); fp = fopen(ficheiro,"r"); if(fp == NULL) { printf("\n>>Impossivel abrir ficheiro %s!<<\n",ficheiro); return ZERO; } printf("\n>>Aberto com sucesso o ficheiro %s!<<\n", ficheiro); while(i < 5000 || !feof(fp)) { fgets(reservas[i].bi, 5, fp); fgetc(fp); fgets(reservas[i].nome, 50, fp); fgets(reservas[i].cid_part, 10, fp); fgets(reservas[i].cid_cheg, 10, fp); fgets(reservas[i].dia, 2, fp); i++; } fclose(fp); printf(">>Foram inseridos %d dados<<\n",i); } porqque e que aparece no ecra nao aparece o printf a dizer foram inscritos... e aparece depois de fechar o while segmentation fault? alguem pode ajudar? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
IceBrain 1 Denunciar mensagem Publicado 13 de Janeiro de 2010 Quando se quer aceder aos campos de uma STRUCT, usa-se essa notação, com o ponto: STRUCT RESERVA x; printf("%s", x.nome); Mas tu aí estás a usar um apontador para uma STRUCT, e portanto a notação é diferente, tens que usar "->": STRUCT RESERVA *y; printf("%s", y->nome); Ou então não é nada disto, visto que não percebo porque é que o compilador não te avisa do problema; o GCC nem me deixa compilar 🤔 Ah, já agora, já reparaste que vais estar a reescrever cada reserva do ficheiro na mesma estrutura "reservas", over and over again? ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Krazzi 0 Denunciar mensagem Publicado 13 de Janeiro de 2010 entao o problema esta em que devo fazer reserva[ i ]. ...... certo? a -> significa tambem [Zero] .... Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
IceBrain 1 Denunciar mensagem Publicado 13 de Janeiro de 2010 Não percebi. Fazer reserva? ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Krazzi 0 Denunciar mensagem Publicado 13 de Janeiro de 2010 nao o erro ta em fgets(reserva[ i ] ....) nao tenho o [ i ] e isso ou nao? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
IceBrain 1 Denunciar mensagem Publicado 13 de Janeiro de 2010 Devias usar "->" em vez de "." para aceder aos campos da "reservas": fgets(reservas->bi, 5, fp); (e o mesmo para o resto dos fgets) ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Krazzi 0 Denunciar mensagem Publicado 13 de Janeiro de 2010 ja fiz isso, e diz que o i e igual a 5218 quando devia ser cerca de 4571 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
TheDark 0 Denunciar mensagem Publicado 13 de Janeiro de 2010 Atenção às tags [ i ] que não aparecem fora das tags [ code ] porque servem para pôr o texto a itálico. Desaparecido. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
IceBrain 1 Denunciar mensagem Publicado 13 de Janeiro de 2010 ja fiz isso, e diz que o i e igual a 5218 quando devia ser cerca de 4571 Para corrigir isso teria que ver o ficheiro de dados (pelo menos um excerto). Já agora, para que serve o fgetc(); ? Btw, a condição do while não está correcta: while(i < 5000 || !feof(fp)) Isto vai implicar que o while vai continuar a correr se qualquer uma das condições for verdadeira, mesmo que a outra não seja. Portanto mesmo que i chegue aos 5000, se o ficheiro não tiver acabado ele continua, e vice-versa: mesmo que o ficheiro tenha acabado, se i < 5000 ele continua. Devias substituir por: while(i < 5000 && !feof(fp)) Atenção às tags [ i ] que não aparecem fora das tags [ code ] porque servem para pôr o texto a itálico. Ah, pois, não tinha reparado. Acho que não devias usar "reservas[ i ]", podes simplesmente usar "reservas++". Visto que "reservas" é um apontador, vai passar a apontar para a posição seguinte. ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Krazzi 0 Denunciar mensagem Publicado 14 de Janeiro de 2010 Acho que não devias usar "reservas[ i ]", podes simplesmente usar "reservas++". Visto que "reservas" é um apontador, vai passar a apontar para a posição seguinte. O que queres dizer com reservas++? fgetc e um espaço que tenho que "apagar" no ficheiro, isso ta correcto Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites