Ir para conteúdo

POWERED BY:

Cangemi

Problemas em ler dados de arquivo com fscanf em arvore binária

Recommended Posts

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?

 

image.png.ac708229baa1f979e25c93cb4c59c3f4.png

 

Arquivo fonte: 

image.png.0911860b5a0acb79e6c1c83a4c721a3d.png

 

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Conteúdo Similar

    • Por biza
      Ola
      Estou  a construir um datalogger em código C.Desta forma necessito passar os dados entre ficheiros. O meu problema está na inclusão de algumas variáveis no topo de um arquivo .txt onde os dados são salvos. Variáveis como tempo de data e hora, id do dispositivo e muito mais... Para isso preciso de ajuda, gostaria que os dados estivessem disponíveis para todos os arquivos, até aí é fácil, basta incluir a variável como extern, no arquivos *.h e incluí-lo em todos os outros que você deseja que a variável esteja disponível. mas como posso fazer para ter acesso a ele dentro do array que preciso?
      Exemplo: main.c
      #include "main.h" char dateTimeFormat[24]; void main(void){ dateTimeFormat = "22-02-22 13:23:04"; } main.h
      extern char dateTimeFormat[24];  
      teste.c
       
      #include "main.h" extern char dateTimeFormat[24]; /*Header .txt file initialization*/ volatile char headerFile[] ="\n\n" "# HEALT MONITORING SYSTEM \r\n" "# DEVELOPED: BIZA \r\n" "# VERSION: B \r\n" "# DATATIMECAPTURE:"+dateTimeFormat+ "\r\n" "# SAMPLINGFREQUENCY: 500 \r\n" "# SAMPLECHANNELS: 1 2 3 4 5 6 7 8 \r\n" "# SAMPLINGRESULUTION: 24 \r\n" "# IDDEVICE: HEALTHY \r\n" "# ENDOFHEADER  
      Como posso incluir a variável "dateTimeFormat" dentro do headerFile como descrevi acima?
       
    • Por oromotoceu
      #include <stdio.h>
      #include <stdlib.h>
      #define MAXTAM 1000
      int Frente, Tras, Lista[MAXTAM];
      void Lista_Construtor(){
      Frente=0;
      Tras=-1;
      }
      int Lista_Vazia(){
      if(Tras==-1)
      return 1;
      else
      return 0;
      }
      int Lista_Cheia(){
      if(Tras==MAXTAM-1)
      return 1;
      else
      return 0;
      }
      int Lista_Tamanho(){
      return Tras+1;
      }
      int Lista_Inserir_Inicio(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      /*se quero inserir na posição 0,
      vou deslocar todos os elementos para frente*/
      for(int i=Tras+1;i>Frente;i--){
      Lista=Lista[i-1];
      }
      Lista[Frente]=Valor;
      Tras++;
      return 1;
        }
      }
      int Lista_Inserir_Fim(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      Tras++;
      Lista[Tras]=Valor;
      return 1;
        }
      }
      int Lista_Inserir(int Valor, int Posicao){
      if(Lista_Cheia()){
      return 0;
      }else{
      /* Para verificar se a posição
      está no meio da lista */
      if(Posicao>Frente && Posicao<Tras){
      for(int i=Tras+1;i>Posicao;i--){
      Lista=Lista[i-1];
      }
      Lista[Posicao]=Valor;
      Tras++;
      return 1;
      }else{ 
      return 0;
         }
        }
      }
      int Lista_Remover_Inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor =Lista[Frente];
      for(int i=Frente;i<Tras;i++){
      Lista=Lista[i+1];
         }
      Tras--;
        }
      }
      int Lista_Remover_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      Tras--;
      return 1;
        }
      }
      int Lista_Remover(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      for(int i=Posicao;i<Tras;i++){
      Lista=Lista[i+1];
      }
      Tras--;
      return 1;
         }
        }
      }
      int Lista_Get_toda(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      return 1;
        }
      }
      int Lista_Busca_Valor(int Valor, int *Posicao){
      int i;
      if(Lista_Vazia()){
      return 0;
      }else{
      for(i=Frente;i<Tras;i++){
      if(Lista==Valor){
      break;
        }
      }
      if(i==Tras){
      return 0;
      }else{
      *Posicao=i; 
      return 1;
         }
        }
      }
      int Lista_Busca_Posicao(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      return 1;
      }else{
      return 0;
         }
        }
      }
      int main(){
      int i,Valor,op=0,pos;
      Lista_Construtor();
      while(op!=12){
      printf("*** Menu de opções ***\n");
      printf("1-Inserir início\n");
      printf("2-Inserir fim\n");
      printf("3-Inserir meio\n");
      printf("4-Excluir início\n");
      printf("5-Excluir fim\n");
      printf("6-Excluir meio\n");
      printf("7-Mostrar toda lista\n");
      printf("8-Mostrar primeiro item da lista\n");
      printf("9-Mostrar último item da lista\n");
      printf("10-Mostrar a posição de um item da lista\n");
      printf("11-Mostrar o valor de uma posição\n");
      printf("12-Sair\n");
      printf("Escolha uma opção: ");
      scanf("%d", &op);
      switch(op){
          case 1:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_Inicio(Valor);
              break;
          case 2:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_fim(Valor);
              break;
            case 3:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja inserir: ");
              scanf("%d", &pos);
              Lista_ Inserir_meio(int Valor, pos); 
              break;
            case 4:
              printf("Digite a remoção do início: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_inicio(*Valor); 
              break;
              case 5:
              printf("Digite a remoção do fim: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_fim(*Valor); 
              break;
              case 6:
              printf("Digite a remoção do meio: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja remover: ");
              scanf("%d", &*Posicao);
              Lista_ Excluir_meio(intValor, * pos); 
              break;
               case 7:
              printf("Digite ao a mostrar toda lista: ");
              scanf("%d", &Valor);
              Lista_ mostrar_toda_lista(Valor);
              break;
             case 8:
              printf("Digite ao a mostrar primeiro item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_primeiro_item_da_lista(*Valor);
              break;
             case 9:
              printf("Digite ao a mostrar último item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_ultimo_item_da_lista(*Valor);
              break;
              case 10:
              printf("Digite ao a mostrar a posição de um item da lista: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja mostrar na lista: ");
              scanf("%d", &* pos);
              Lista_ mostrar_posicao_de_um_item_da_lista(intValor, *pos);
              break;
              case 11:
              printf("Digite ao a mostrar o valor de uma posição: ");
              scanf("%d", &*Valor
              printf("Digite a posição que deseja mostrar no valor: ");
              scanf("%d", &pos);
              Lista_ mostrar_posicao_de_um_valor_da_lista(int*Valor, pos);
              break;
              case 12:
              default:
              printf("Valor Invalido!\n");
              system("PAUSE");
               }
         }
       return 0;
      }
    • Por oromotoceu
      bom dia pode me ajudar nessa questão por favor
      O programa deverá trabalhar dados de um veículo, onde será armazenado, Nome do proprietário, placa do carro, modelo do carro e preço do carro.
      O programa deve ter as seguintes opções:
      Inserir dados (todos os dados sugeridos no enunciado acima).
      Excluir um Carro específico com a busca pela placa.
      Editar dados de um Carro com a busca pela placa.
      Consultar carro por Placa.
      Exibir todos os dados cadastrados.
      Finalizar programa.
      A opção exibir todos os dados, apresenta tudo que já foi cadastrado e está na memória.
       
    • Por TK_T
      olá sou iniciante consegui fazer um o código de um exercício só que quando eu peço o valor 12ab ele lê como numérica alguém pode me ajudar? 
      Exercício: Leia uma string e diga se a mesma é numérica (na base decimal) ou não.
      Ex.: "123" -> numérica
      "abc" -> não numérica
      "12ab" -> não numérica
      "12.34" -> numérica 
      #include <stdio.h> int main() { char Numero; printf("Digite Algo: "); scanf("%c", &Numero); if(Numero == '1' || Numero == '2' || Numero == '3' || Numero == '4' || Numero == '5' || Numero == '6' || Numero == '7' || Numero == '8' || Numero== '9' || Numero == '0') printf("\tNumérica...\n"); else printf("\tNão Numérica\n"); return 0; }  
    • Por cgm2k7
      Boa noite!
      Bom preciso de uma dica/ajuda em uma problema...
      tenho duas structs, LIST e NO.  lista duplamente encadeada.
      //insiro/crio 100.000 nos.
       
      struct no{ char *nome; char sexo; float nota; float media; int id; struct no *next, *prev; }; struct list{ long int size_list; struct no *begin, *end; }; typedef struct no NO; typedef struct list LIST; for(int y = 0; y < 100000; y++) inserir_inicio(*list); void CreateNo(NO **no) { *no = (NO*)calloc(1,sizeof(NO)); if (*no) { (*no)->nome = "cicero"; (*no)->sexo = 'M'; (*no)->nota = 0.0; (*no)->media = 1; (*no)->id++; (*no)->next = NULL; (*no)->prev = NULL; is_Ok = true; } else { printf("ERRO: Ao alocar memoria em 'void CreateNo(NO **no)'\n"); is_Ok = false; return; } } void inserir_inicio(LIST *list) { NO *no; CreateNo(&no); if (is_Ok) { no->next = list->begin; list->begin = no; list->size_list++; } } // destroy os nos void DestoyList(LIST **list) { if ((*list)->begin == NULL) { free(*list); printf("Lista vazia!\n\n"); } else { NO *p = (*list)->begin, *tmp = NULL; while (p != NULL) { tmp = p; p = p->next; /*tmp->nome = "0"; tmp->sexo = '\0'; tmp->id = 0; tmp->media = 0;*/ free(tmp); } free(p); (*list = NULL); } } o problema é o seguinte:
      quando inicio o aplicativo ele começão com 512kb, quando criando  100.000  na memoria heap, aumenta para mais ou menos uns 7,8mb, bom ate aqui tudo oks
      mas quando delete este nos com o free() esperava eu q retornasse para os mesmo 512kb inicias do aplicativo, mas isso não acontece, ele retorna para 1,3mb.
      minha pergunta é: porque não deleta tudo, já setei zeros e para todos os membros da struct no mas mesmo assim não deleta tudo.
      Se alguém poder meda da uma dica. OBS: não quero código  pronto eu quero apenas dicas se possível bem explicada porque sou meio novato em c kkk.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.