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

lesiano

Ler de ficheiro para lista ligada;

10 mensagens neste tópico

Boas;

Estou a tentar ler de um ficheiro para uma lista ligada, duas strings e um inteiro.

CLIENTE noactual, cabeca; 
			     
			     cabeca = noactual;

			     FILE *p;

			     p = fopen("clientes.txt","r");

			     char *string;

			     while(fgets(string,100,p)!="EOF"){
							       (noactual -> nome) = (char*)strdup(string);
							       fgets(noactual -> morada,100,p);
			                                       fscanf (p, "%d", &(noactual -> contribuinte));
							       noactual = noactual -> seg;
					       		       }
			     return cabeca;
                                     fclose(p);								     
			     }

Alguém sabe se está alguma coisa mal? Dá-me segmentation fault.

O file tem:

José Joaquim Baderous

Rua das Flores

12934759

António Baderous

Rua do Corgo

64646464

...

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Onde é que estás a alocar o espaço para os elementos que estás a ler?

Aquilo que tens que fazer é basicamente inserir os dados que lês no fim da lista. Como é que farias uma função de inserção?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

CLIENTE 
carrega_ficheiro_clientes()
{
CLIENTE         noactual, cabeca, novo = NULL;
int             i = 1, contribuinte;

char           *nome = (char *) malloc(100 * sizeof(char));
char           *string = (char *) malloc(100 * sizeof(char));
char           *morada = (char *) malloc(100 * sizeof(char));

cabeca = noactual;

FILE           *p;

p = fopen("clientes.txt", "r");

while (fgets(string, 100, p) != "EOF") {
	if (i == 1) {
		cabeca = (CLIENTE) malloc(sizeof(struct cliente));
		(cabeca->nome) = (char *) strdup(string);
		fgets(cabeca->morada, 100, p);
		fscanf(p, "%d", &(cabeca->contribuinte));
		cabeca->seg = novo;
		i++;
	} else {
		nome = (char *) strdup(string);
		fgets(morada, 100, p);
		fscanf(p, "%d", &contribuinte);
		cabeca = insere_cli_de_ficheiro(cabeca, nome, morada, contribuinte);
	}
}
return cabeca;
fclose(p);
}

CLIENTE 
insere_cli_de_ficheiro(CLIENTE cabeca, char *nome, char *morada, int con)
{
CLIENTE         novo, noactual;

noactual = cabeca;

while (noactual->seg != NULL) {

	noactual = noactual->seg;

}

novo = (CLIENTE) malloc(sizeof(struct cliente));
(novo->nome) = (char *) strdup(nome);
(novo->morada) = (char *) strdup(morada);
novo->contribuinte = con;
novo->seg = NULL;
noactual->seg = novo;

return cabeca;
}

Tenho isto, mas dá falha de segmentação. Ideias?

Obg.

Ps: Rui, estava cheio de sono qd fiz a anterior, é normal ter-me esquecido de quase tudo.  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

da falha de segmentaçao aonde?poe printfs ao longo do codigo apanha o valor d retorno do strdup.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também é capaz de ser boa ideia usares o GDB para saber onde é que o erro ocorre.

E já agora, o fclose depois do return também não está ali a fazer nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso troquei Rui. :P

Qd ao gdb ñ me dá, vou experimentar a técnica dos prints. Obgdão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas. Apesar de não estar a responder propriamente ao que foi perguntado neste tópico, tenho uma dúvida semelhante.  Estou a tentar guardar em ficheiro e depois ler, estruturas de listas ligadas, neste caso concreto, de um grafo. Mas por mais que procure, nao tou a encontrar/perceber como se trabalha com ficheiros em modo binário.

o meu código inclui algo como isto:

   
   ... 
   FILE *f; 
   PtGrafo teste = CriaGrafo();

   f=fopen("ficheiro","w");
   
   puts("\nWorking. . .\n");
   
   AdicionaCidade(teste,"Lisboa");
   fwrite(teste, sizeof(struct grafo),1,f);
   
   AdicionaCidade(teste,"Porto");
   fwrite(teste, sizeof(struct grafo),1,f);
   
   AdicionaCidade(teste,"Coimbra\n");
   fwrite(teste, sizeof(struct grafo),1,f);
   
   AdicionaCidade(teste,"Coimbra\n");
   fwrite(teste, sizeof(struct grafo),1,f);
   
   fclose(f);
   
   puts("\nStill Working. . .\n");
   
   
   
   
   f=fopen("ficheiro","r"); 
   
   
   while(teste != NULL){
      fread((struct grafo)teste,sizeof(struct grafo),1,f);
        
        printf("%s\n", teste -> Head -> nome);
      teste = teste -> Head -> PtSeg;
   }
      
    fclose(f);

Isto dá-me erro na parte de leitura... Apesar de eu nem sequer saber se estou a guardar correctamente em ficheiro  :dontgetit:

Não encontro nada de jeito sobre como trabalhar com isto . . . Alguém me pode ajudar?

0

Partilhar esta mensagem


Link 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