Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Krazzi

Estruturas e Ficheiros

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.