Ir ao conteúdo

Posts recomendados

Postado

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?

 

#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);


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        | [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 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);
			carregar();
			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 *salvar(struct jogador *i)     // função que salva os dados no arquivo, esta funcionando.
{  
	if(i!=NULL)
	{
		if((p=fopen(time,"a"))==NULL)
		{
			printf("\nErro na abertura do arquivo\n");
			system("pause");
		}
		else
		{
			fprintf(p," %s %s %c %f %i ",i->nome,i->posicao,i->escalacao,i->salario,i->numero);
		}
		fclose(p);
		salvar(i->esq);
		salvar(i->dir);	
	}
}


void carregar() // função para ler os arquivos
{
		p=fopen(time,"r");

		while((fscanf(p,"%s %s %c %f %i",name,position,&lineup,&salary,&num))!=EOF)// variaveis globais
		{
          	// 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);
}

 

  • Amei 1
Postado

Não testei, mas lendo o código por alto notei esse problema:

 

Você usou gets na hora de pedir para o usuário digitar o nome do jogador, então o usuário pode digitar nome e sobrenome da pessoa, e isso significa que terá 1 espaço no meio do nome, como em "Joao Santos".

 

Então você salva o nome no arquivo fazendo:

fprintf(p," %s %s %c %f %i ",i->nome,i->posicao,i->escalacao,i->salario,i->numero);

 

Só que na hora de ler você faz:

fscanf(p,"%s %s %c %f %i",name,position,&lineup,&salary,&num)

Usando %s para ler o nome, mas como o nome tinha espaço entre Joao e Santos, o nome lido será apenas "Joao", e aí bagunça todo o resto da leitura do scanf pois a posição agora virou "Santos", a escalação agora é a primeira letra da posição, e nem vai ler o salário e o número.

 

 

 

 

Então minha sugestão é: No fprintf escrever os dados no arquivo, use outro caractere para separar os dados que não seja espaço, por exemplo pode usar ponto-e-vírgula ( ; ) para separar, ficando assim:

 

fprintf(p,"%s;%s;%c;%f;%i\n",i->nome,i->posicao,i->escalacao,i->salario,i->numero);

 

(Obs: Arquivos com extensão .CSV usam ponto-e-vírgula (ou então vírgula) como separador de colunas da tabela, então você poderia até abrir seu arquivo no excel ou libreoffice e os dados ficariam separados nas colunas da tabela).

 

 

 

Fazendo isto você pode trocar especificador de string %s pelo outro especificador de string %[ no fscanf, limitando para ler todos os caracteres até encontrar um ; , ou seja ficando assim %[^;] (ler e guardar todo caractere que for diferente de ; ).

fscanf(p," %[^;];%[^;];%c;%f;%i%*c",name,position,&lineup,&salary,&num)

Assim vai ler a string inteira entre os ponto-e-vírgula, incluindo os espaços que existirem.

  • Curtir 1
Postado

Ola, muito obrigado por olhar o código e pelas dicas. Implementei no código porém o erro persiste. Quando eu fecho o programa e abro de novo ele lê somente dois cadastros, como na foto: image.png.ac708229baa1f979e25c93cb4c59c3f4.png

 

porém antes de fechar o código eu tinha cadastrado três jogadores, olha a imagem do arquivo: 

image.png.0911860b5a0acb79e6c1c83a4c721a3d.png

 

ele lê somente as duas primeiras linhas.

 

A parte do código reajustado:

void carregar()
{
		p=fopen(time,"r");

		while(fscanf(p,"%[^;];%[^;];%c;%f;%i%*c",name,position,&lineup,&salary,&num)!=EOF)
		{
			printf("\n-----|%i|-----\n",num);	
			pointer=criar(pointer);
		}
		system("pause");
		fclose(p);
}

Muito obrigado pela ajuda.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!