Olá, alguém pode me ajudar? Estou fazendo um trabalho para estrutura de dados sobre arvore binária e eu decidi usar as funções fprintf para salvar as informações em arquivo e fscanf para ler essas informações e joga - las na minha função de inserção da arvore. O programa está funcionando, ele salva dos dados da arvore, só que, o que acontece é, que na hora de usar o fscanf ele não lê todas as informações contidas no arquivo, ele lê somente dois cadastros e joga pra função de inserção. Alguém sabe como eu posso corrigir isso?
Arquivo fonte:
Código completo:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
struct jogador
{
char nome [31];
char posicao [15];
char escalacao;
float salario;
int numero;
struct jogador *esq;
struct jogador *dir;
};
struct jogador *raiz;
struct jogador *pointer;
struct jogador *r;
FILE *p;
char name [31]=" ", time[51];
char position [15]=" ";
char lineup;
float salary=0;
int num=0, aux = 0;
void cadastrar();
void carregar();
struct jogador *salvar(struct jogador *i);
struct jogador *criar( struct jogador *a); // função para inserir
struct jogador *listar(struct jogador *i, int x);
struct jogador *all (struct jogador *i);
main()
{
pointer = NULL;
raiz = NULL;
int op;
do
{
printf("\t\t\t\t\t\t--------------------------\n");
printf("\t\t\t\t\t | *-*-*Time*-*-* |\n\t\t\t\t\t | |\n\t\t\t\t\t | | \n");
printf("\t\t\t\t\t | [1] Escolher o time |\n\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | [2] Contratar jogador |\n\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | [4] Listar crescente | \n\t\t\t\t\t | | \n");
printf("\t\t\t\t\t | [5] Listar decrescente | \n\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | [6] Excluir time | \n\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | [9] Salvar | \n\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | [0] Sair |\n");
printf("\t\t\t\t\t\t--------------------------\n");
printf("\t\t\t\t\t Opcao [ ]\b\b");
scanf("%i",&op);
switch(op)
{
case 1:
{
aux=0;
cadastrar();
}
break;
case 2:
{
cadastrar();
}
break;
case 4:
{
if(raiz==NULL)
{
printf("\n Nao possui cadastro.\n");
system("pause");
}
else
{
system("cls");
listar(pointer, 1);
system("pause");
}
}
break;
case 5:
{
if(raiz==NULL)
{
printf("\n Nao possui cadastro.\n");
system("pause");
}
else
{
listar(pointer, 2);
system("pause");
}
}
break;
case 6:
{
if(raiz!=NULL)
{
pointer=all(pointer);
printf("\n Todos os jogadores foram excluidos\n");
system("pause");
}
else
{
printf("\n*****Nenhum jogador cadastrado*****.\n");
system("pause");
}
}
break;
case 9:
{
p=fopen(time,"w");
fclose(p);
salvar(pointer);
}
break;
}
system("cls");
}while(op!=0);
}
void cadastrar ()
{
char resposta;
char answer;
do
{
if(aux==0)
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t\t Escolha o time para iniciar \n");
printf("\t\t\t\t\t\t___\b\b\b ");
fflush(stdin);
gets(time);
strcat(time,".csv");
carregar();
fclose(p);
aux = 1;
return;
}
system("cls");
printf("\nNome do jogador: ");
fflush(stdin);
gets(name);
printf("\nPosicao do jogador: ");
fflush(stdin);
gets(position);
printf("\nO jogador e titular? <S/N>: ");
answer=getche();
if(toupper(answer)=='S')
{
lineup = 'T';
}
else
{
lineup = 'R';
}
printf("\n");
printf("\nSalario pago ao jogador: ");
scanf("%f",&salary);
printf("\nInforme o numero do jogador: ");
scanf("%i",&num);
pointer=criar(pointer);
printf("\nCadastrar novamente? <S/N>: ");
resposta=getche();
printf("\n ");
}while(toupper(resposta)=='S');
}
struct jogador *criar( struct jogador *a)
{
if(a==NULL)
{
r=(struct jogador*)malloc(sizeof(struct jogador));
if(!r)
{
printf("\n Nao ha memoria");
exit(1);
}
strcpy(r->nome,name);
strcpy(r->posicao,position);
r->escalacao = lineup;
r->salario = salary;
r->numero = num;
r->esq = NULL;
r->dir = NULL;
if(raiz==NULL)
{
raiz=r;
}
return r;
}
else
{
if(num>a->numero)
{
a->dir=criar(a->dir);
}
else
{
if(num<a->numero)
{
a->esq=criar(a->esq);
}
else
{
printf("\n Jogador ja cadastrado\n");
system("pause");
return a;
}
}
}
fclose(p);
return a;
}
struct jogador *listar(struct jogador *i, int x)
{
if(i!=NULL&&x==1)
{
listar(i->esq, x);
printf("\t\t\t\n----------\n");
printf("\n-----|%s|-----\n",i->nome);
printf("\n-----|%s|-----\n",i->posicao);
printf("\n-----|%c|-----\n",i->escalacao);
printf("\n-----|%.2f|-----\n",i->salario);
printf("\n-----|%i|-----\n",i->numero);
listar(i->dir, x);
}
if(i!=NULL&&x==2)
{
listar(i->dir, x);
printf("\n-----|%i|-----\n",i->numero);
listar(i->esq, x);
}
return i;
}
struct jogador *all (struct jogador *i)
{
if(i->esq!=NULL)
{
all(i->esq);
}
if(i->dir!=NULL)
{
all(i->dir);
}
free(i);
if(i==raiz)
{
raiz=NULL;
i=raiz;
}
return i;
}
struct jogador *salvar(struct jogador *i) // função que salva os dados no arquivo, esta funcionando.
{
if(i!=NULL)
{
salvar(i->esq);
p=fopen(time,"a");
strcpy(name,i->nome);
strcpy(position,i->posicao);
lineup = i->escalacao;
salary = i->salario;
num = i->numero;
fprintf(p,"%s;%s;%c;%f;%i\n",name,position,lineup,salary,num);
salvar(i->dir);
}
fclose(p);
}
void carregar() // função para ler os arquivos
{
if((p=fopen(time,"r"))==NULL)
{
return;
}
else
{
while(fscanf(p,"%[^;];%[^;];%c;%f;%i%*c",name,position,&lineup,&salary,&num)!=EOF)
{
// esse printf foi colocado pra saber quais numeros ele esta lendo.
printf("\n-----|%i|-----\n",num); // ele le somente dois cadastros, se tiver mais ele não le, e por isso não joga na função de inserção.
pointer=criar(pointer); // chamada da função de inserção, os dois unicos cadastros que são lidos, são inseridos corretamente.
}
system("pause");
}
fclose(p);
}