Ir para o conteúdo
mateus8

Leitura de ficheiro txt

Mensagens Recomendadas

mateus8

Boa tarde,

Estou a fazer um projecto e queria que me ajudassem ,passa-se o seguinte o prof disponibilizou os dados no ficheiro txt e apartir dai temos de carregar os dados para a estruturas.

Quando corro o programa ele bloquea nao faz nada

void lerficheiro(ARVORE A,char *fich){
NO tmp_no =(NO) A->ndonos;
FILE *fp;
fp=fopen(fich, "r");
if(fp==NULL)
printf("\n erro na leitura do ficheiro");
else
{
while(!feof(fp))
{
fscanf(fp,"%d %s[a] %s[b]", &tmp_no->inf->num_c,tmp_no->inf->nome,tmp_no->inf->codigo_p);
insere_no(tmp_no,A->raiz);
}
}
fclose(fp);
}

e isto ainda esta em fase de teste

void main()
{
ARVORE Arvore = criar_arvore();
int a;
scanf("%d", &a);
while(1)
if(a == 1)
lerficheiro(Arvore, "donos.txt");
else
if(a == 2)
return;
}

Desde ja obrigado pela ajuda

Atentamente

Mateus

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Ista esta quase sempre errado.

while (!feof(fp)) { /* ... */ }

A funcao feof() nao averigua se a proxima leitura vai falhar devido a se ter consumido todos os dados existentes no ficheiro. A funcao averigua se a razao do ultimo erro foi de se ter tentado ler depois de se ter consumido todos os dados.

No teu programa a parte que consome dados esta no fscanf()

fscanf(fp,"%d %s[a] %s[b]", &tmp_no->inf->num_c,tmp_no->inf->nome,tmp_no->inf->codigo_p);

Podes saber se o fscanf() falhou verificando se ele devolve o valor respectivo com o numero de variaveis presentes (no teu caso 3).

Se o fscanf() der certo, tratas os dados e prossegues com o ciclo.

Se o fscanf() der erro, podes talvez assumir que o erro foi de nao haver mais dados e sais do ciclo (se quiseres averiguar a razao do erro tambem podes).

Altera o teu programa para:

while (fscanf(...) == 3) {
 /* trata dados */
}


O valor devolvido pelo scanf() pode ser

a) igual ao numero de variaveis: tudo normal

b) entre 0 inclusive e o numero de variaveis exclusive: nem todas as variaveis foram atribuidas ou porque nao havia dados suficientes, ou porque houve um erro de leitura (falha no disco, cabo de rede desligado, ...) ou porque houve um erro de interpretacao de dados ("%d" ver "Janeiro" por exemplo)

c) EOF (um valor negativo): nao havia dados disponiveis para atribuicoes ou interpretacao de dados.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mateus8

eu tentei assim e continua igual e que ele nem le o ficheiro, ja tentei com strtok e nao consigo mostra logo a mensagem de fazer break ou continue

void lerficheiro(ARVORE A,char *fich){
NO tmp_no =(NO) A->ndonos;
FILE *fp;
fp=fopen(fich, "r");
if(fp==NULL)
printf("\n erro na leitura do ficheiro");
else
{
while (fscanf(fp,"%d %s[a] %s[b]", &tmp_no->inf->num_c,tmp_no->inf->nome,tmp_no->inf->codigo_p) == 3)
{
printf("\n num_c %d",&tmp_no->inf->num_c);
printf("\n nome %s",tmp_no->inf->nome);
printf("\n codigo postal %s",tmp_no->inf->codigo_p);
insere_no(tmp_no,A->raiz);
}
}

fclose(fp);
}

esta e a parte que me ta a custar mais é carregar os dados para as estruturas

Obrigado pela ajuda

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Entao, para fazer DEBUG, mete isto antes do while

int chk = fscanf(fp,"%d %s[a] %s[b]", &tmp_no->inf->num_c,tmp_no->inf->nome,tmp_no->inf->codigo_p);
printf("DEBUG: o scanf devolveu %d\n", chk);
if (chk >= 1) printf("    tmp_no->inf->num_c tem %d\n", tmp_no->inf->num_c);
if (chk >= 2) printf("    tmp_no->inf->nome tem %s\n", tmp_no->inf->nome);
if (chk >= 3) printf("    tmp_no->inf->codigo_p tem %s\n", tmp_no->inf->codigo_p);

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mateus8

eu acho estranho selecciono a opção 1 e depois aparece aquela mensagem mesmo com as alterações que efectuei acho estranho

desde já obrigado pmg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Talvez a mensagem seja da funcao criar_arvore()?

Oh! A funcao main() devolve int, sempre!

int main()
{
 printf("antes\n");
 ARVORE Arvore = criar_arvore();
 printf("depois\n");


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mateus8

agora ja apareceu antes e depois

Não sei o que será mesmo

estas são as funções criar no e arvore

ARVORE criar_arvore()
{
ARVORE A;
A = (ARVORE) malloc (sizeof(struct arvore));
A->raiz = NULL;
A->ndonos = 0;
return A;
}
NO criar_no(){
NO N   = (NO) malloc (sizeof(struct no));
N->inf = (DONO) malloc (sizeof(struct dono));
N->esq = NULL;
N->dir = NULL;
return N;
}

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

A maioria dos casts em C, em principio, esta errada (excepto nos sitios onde eles sao necessarios e a maioria das vezes nao estao la!)

O teu programa é um exemplo bom disso

NO tmp_no =(NO) A->ndonos;

Para que é o cast? Para o compilador nao dar erro? Mas se o compilador da erro, deve ter alguma razao para isso! Tira os casts todos do teu programa: nao ha nenhum necessario.

Quanto a esta linha: o tmp_no nao pode ser um inteiro, pois nao?


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mateus8

mas se eu não fizer o cat ele assim nao vai guardar a informação lida do ficheiro .so se guardar os dados apenas nas variáveis

obrigado pela ajuda pmg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mateus8

esta função consegue que aparece os dados do ficheiro a aparecer na consola ,mas não sei como conseguir guardar os dados nas variáveis

printf("Inicio \n");
FILE *f = fopen("donos.txt","r");
if (!f) printf("ERRO\n");
else
{
 while (!feof(f))
 {
  char mens[100];  
  fgets(mens, 100, f);
  char *pch;
  pch = strtok (mens,"\t\n");
  while (pch != NULL)
  {
   printf ("[%s]\n",pch);
   pch = strtok (NULL, "\t\n");
  }
 }
 fclose(f);
}

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.