Jump to content

Leitura de ficheiro txt


mateus8

Recommended Posts

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

Edited by pmg
Falta LP no GeSHi
Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Edited by pmg
Falta LP no GeSHi
Link to comment
Share on other sites

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);
Edited by 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!

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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;
}
Edited by pmg
Falta LP no GeSHi
Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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);
}
Link to comment
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
×
×
  • Create New...

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.