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

Upper

Problema com struct e Files

Mensagens Recomendadas

Upper

Boas...tou com um pequeno problema. Quando faço o mostrar o que se encontra na estrutura(depois de ter inserido nela apartir de um ficheiro) so me aparece a ultima linha do ficheiro. O que falta na leitura do ficheiro?

RESERVA tabela_reservas[5000];

void ler_ficheiro(RESERVA *tabela_reservas)
{

FILE *fp;
char ficheiro[NOMES];
int i = 0;
	fprintf(stdout, "Introduza o nome do ficheiro: ");
fscanf(stdin," %s",ficheiro);
fp = fopen(ficheiro,"r");
if(fp == NULL)	
{
	printf(">>Impossivel abrir ficheiro %s!<<\n",ficheiro);
	return;
}
else{
        	while(!feof(fp))
	{
	fscanf(fp, "%d", &tabela_reservas->pass.bi);
	fgets(tabela_reservas->pass.nome, NOMES, fp);
	fscanf(fp, "%s", tabela_reservas->cid_part);

	fscanf(fp, "%s", tabela_reservas->cid_cheg);
	fscanf(fp, "%d", tabela_reservas->dia);

	i++;
	} 


}
printf("\nAberto com sucesso!\n");
fclose(fp);

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

Repara que tens uma variável i, mas a unica coisa que fazes com ela é incrementar e não a usas como indice.

tabela_reservas->cid_part

É equivalente a

tabela_reservas[0].cid_part

Porque o nome de um array serve como apontador para a primeira posição desse array. Ou seja, tu estás sempre a escrever a informação sobre a primeira posição.

Tens de usar

tabela_reservas[i].cid_part

(utilizando a variavel i que já tens, ou um apontador como o tabela_reservas e ir incrementando o apontador em vez de i. A variavel i passaria a ser inutil)

PS: não vejo nada para guardar quantos registos tens. Tem atenção a isso.


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O que o mogers estava a dizer basicamente é que tu para guardares dados nas structs tens de colocar o indice, uma variável auxiliar, porque o nome de um array é um ponteiro para o primeiro elemento, se tu não colocares o indice ou modificares o valor da variável auxiliar ele vai estar a guardar sempre na mesma posição (no mesmo array).


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

Como assim? nao tou a perceber

Quando sais dessa função de leitura, ficas sem saber quantos registos é que o array tem. Assim, convinha que usasses algum metodo para que a função que chama o ler_ficheiro saiba quantos existem (e.g. a função pode retornar esse número ou usar um parametro que é um apontador para um int e colocas aí a informação).


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Upper

tou agora com outro problema: como e que eu faço pra escrever num ficheiro o que se encontras na struct?

int escrever_ficheiro(RESERVA *tabela_reservas)

{                                                                                                                                                                            



FILE *fp;

char ficheiro[NOMES];

int i = 0, n = 0;

char string[NOMES];

	fprintf(stdout, "Introduza o nome do ficheiro: ");

fscanf(stdin," %s",ficheiro);

fp = fopen(ficheiro,"wb");

if(fp == NULL)	

{

	printf("\n>>Impossivel abrir ficheiro %s!<<\n",ficheiro);

	return ZERO;

}

else{

	for(i=0;i<tabela_reservas->num_pass;i++)				

	if(fwrite(tabela_reservas[i].pass.bi,sizeof(tabela_reservas.pass.bi),1,fp)!=1) return ZERO;

            }


fclose(ficheiro);

return ZERO;



}

A minha duvida e: o que meto na parte do sizeof?

EDIT: a tag é code, não quote.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

No sizeof tens de colocar o tipo da estrutura que definiste quando a criaste. Assim:

struct typeteste {
  int blabla;
};

sizeof(struct typeteste);

Não coloquei toda a sintaxe da função fwrite mas acho que deu para perceber.


here since 2009

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.