Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Krazzi

Estruturas e Ficheiros

Recommended Posts

Krazzi

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?

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


Link to post
Share on other sites
Krazzi

entao o problema esta em que devo fazer reserva[ i ]. ...... certo?

a -> significa tambem [Zero] ....

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


Link to post
Share on other sites
TheDark

Atenção às tags [ i ] que não aparecem fora das tags [ code ] porque servem para pôr o texto a itálico.


Desaparecido.

Share this post


Link to post
Share on other sites
IceBrain

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

Share this post


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

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×

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.