Jump to content
Sign in to follow this  
pxdc

Carregar informações ficheiro .txt

Recommended Posts

pxdc

Boas tenho um problema e espero que me possam ajudar pois deve ser uma coisa fácil mas não estou a ver o que seja.

Eu pretendo guardar informações num ficheiro .txt e depois ser possível carregar essa informação mas não estou a conseguir.

Esta é a função que me permite guardar a informação e está a funcionar.

void guardar(Cartao c)
{FILE * ct;
ct = fopen("DadosClientes.txt", "w");
while(c !=NULL){

fprintf(ct,"%s",c->id);
fprintf(ct,"-%d",c->bi);
fprintf(ct,"-%s",c->nome);
fprintf(ct,"-%.2f\n",c->saldo);
c=c->seguinte;
}
fclose(ct);
}
Esta é a função para a leitura mas não estou a conseguir, compila e não crasha mas não faz o que pretendo.
void ler(Cartao c)
{FILE * ct;
ct = fopen("DadosClientes.txt","r");
while(c !=NULL){      
fscanf(ct,"%s-",c->id);
fscanf(ct,"%d-",c->bi);
fscanf(ct,"%s-",c->nome);
fscanf(ct,"%.2f\n",c->saldo);
c=c->seguinte;
}
fclose(ct);
}
Na main tenho guardar(c), ler(c) e listar(c), que é para quando ler a informação a listar.

Espero que me consigam ajudar.

Share this post


Link to post
Share on other sites
KTachyon

Não deverias estar a criar um cartão por cada leitura, em vez de passares um ponteiro e preencheres?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
KTachyon

Exactamente assim. Passas um ponteiro para a função, atribuis o primeiro cartão criado a esse ponteiro. Depois vais ligando os ponteiros sucessivamente à media que vais criando mais nós (utilizando um malloc de cada vez que necessitas de criar um cartão, e ligares o ponteiro do cartão que criaste anteriormente a este novo cartão).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pxdc

mas os cartões já estão criados, pretende-se agora é guardar e carregar essa informação.

//INSERIR CARTÕES
Cartao inserir(Cartao c, char * id, int bi, char * nome, float s=500)
{Cartao novo, CartaoAux = c;
  novo=(Cartao)malloc(sizeof(struct tipo1));
          strcpy( novo->id,id);
          novo->bi=bi;
           novo->saldo=s;
           strcpy(novo->nome,nome);
novo->seguinte = NULL;
if (c == NULL) return(novo);
else 
{while (CartaoAux -> seguinte != NULL)
   CartaoAux = CartaoAux -> seguinte;
  CartaoAux->seguinte = novo;
  return(c);
}
}          

//LISTAR CARTÕES                        
void listar(Cartao c){ 
     Cartao aux=c;
  //Testar se a lista não é vazia
if (c != NULL){
   //Se a lista contém somente uma célula
  if (c == c -> seguinte){
         printf("\n%s""%d""%s""%.3f\n", c->id,c->bi,c->nome,c->saldo);
  }
   //Senão se a lista contém pelo menos duas células
  else 
  do{
       printf("\n%s""-""%d""-""%s""-""%.3f\n", aux->id,aux->bi,aux->nome,aux->saldo);
   aux = aux->seguinte;
  }
  while(aux !=  NULL);
}
}

Share this post


Link to post
Share on other sites
KTachyon

O ponteiro que passas para a função guardar é o mesmo que usar para apontar para a cabeça da lista? Se sim, quando estás a ler, o c == NULL.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pxdc

sim é o mesmo ponteiro, a segunda parte do teu post não percebi... :bye2:

Share this post


Link to post
Share on other sites
KTachyon

Imagina: chamas o gravar© e ele grava tudo no ficheiro, certo? Quando acaba a função gravar(), como a tua condição do while é c != NULL, significa que quando a função acabar, o teu c vai ser NULL (sim, estás a alterar o valor do ponteiro).

Quando chamas o ler©, estás a fazer ler(NULL), logo ele nunca entra no while da função ler().

Finalmente, listar©, que, tal como para o ler(), estarás a chamar listar(NULL) que não faz nada.

Solução: atribuir o valor do ponteiro a outra variável.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pxdc

mas imagina, se eu fizer guardar() e fechar o progrma e abrir-lo de novo e fizer carregar, o apontador vai estar a apontar para NULL?

se sim onde sugeres que altere o codigo?

obrigado pela ajuda que me estás a dar

Share this post


Link to post
Share on other sites
KTachyon

Não estará a apontar para NULL se estiveres a criar as estruturas antes de gravares (que foi o que disseste que estavas a fazer). Tens que criar outro ponteiro para substituir o teu ponteiro geral. Por exemplo, para a função guardar:

void guardar(Cartao c)
{FILE * ct;
Cartao h = c;
ct = fopen("DadosClientes.txt", "w");
while(h !=NULL){

fprintf(ct,"%s",h->id);
fprintf(ct,"-%d",h->bi);
fprintf(ct,"-%s",h->nome);
fprintf(ct,"-%.2f\n",h->saldo);
h=h->seguinte;
}
fclose(ct);
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pxdc

Não estará a apontar para NULL se estiveres a criar as estruturas antes de gravares (que foi o que disseste que estavas a fazer). Tens que criar outro ponteiro para substituir o teu ponteiro geral. Por exemplo, para a função guardar:

void guardar(Cartao c)
{FILE * ct;
Cartao h = c;
ct = fopen("DadosClientes.txt", "w");
while(h !=NULL){

fprintf(ct,"%s",h->id);
fprintf(ct,"-%d",h->bi);
fprintf(ct,"-%s",h->nome);
fprintf(ct,"-%.2f\n",h->saldo);
h=h->seguinte;
}
fclose(ct);
}

em primeiro eu crio as estruturas (insiro os cartões) e depois guardo.

depois Se fizer carregar sem ter fechado o programa o programa lista os cartões que é o que se pretende.

se depois de guardar, fechar o programa e voltar a abrir e fizer carregar, ele não lista nada.

Share this post


Link to post
Share on other sites
KTachyon

Basicamente, tens que manter o ponteiro inicial imutável, senão nunca mais consegues aceder à lista quando chegas a null. Deixas de ter um ponteiro que indique onde começa a lista.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pxdc

então recorrendo as funções que já postei onde sugeres que altere o codigo?

Share this post


Link to post
Share on other sites
RSFalcon7

aqui:

void guardar(Cartao _c)
{FILE * ct;
Cartao c = _c
ct = fopen("DadosClientes.txt", "w");
while(c !=NULL){

fprintf(ct,"%s",c->id);
fprintf(ct,"-%d",c->bi);
fprintf(ct,"-%s",c->nome);
fprintf(ct,"-%.2f\n",c->saldo);
c=c->seguinte;
}
fclose(ct);
}

aqui tens outro erro no scanf, esqueces-te do '&'

void ler(Cartao c)
{FILE * ct;
ct = fopen("DadosClientes.txt","r");
while(c !=NULL){      
fscanf(ct,"%s-",c->id);
fscanf(ct,"%d-",&c->bi);
fscanf(ct,"%s-",c->nome);
fscanf(ct,"%.2f\n",&c->saldo);
c=c->seguinte;
}
fclose(ct);
}

Share this post


Link to post
Share on other sites
KTachyon

E do \n a mais.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.