Ir para o conteúdo
jett

Árvore binária em arquivo

Mensagens Recomendadas

jett

Bom, estou tentando criar um programa que armazena informações numa árvore binária (grava e lê) em disco:

typedef struct arvore{
   int id;
   char marca[50];
   char modelo[50];
   char cor[20];
   char proprietario[50];
   struct arvore *dir;
   struct arvore *esq;
}arvore;

arvore *aloca(){
   arvore *novo = (arvore*)malloc(sizeof(arvore));
   printf("Entre com a Identificacao do veiculo: ");
   scanf("%d", &(novo->id));
   printf("Digite a marca do veiculo: ");
   fflush(stdin);
   fgets(novo->marca, 50, stdin);
   printf("Digite o modelo do veiculo: ");
   fgets(novo->modelo, 50, stdin);
   printf("Digite a cor do veiculo: ");
   fgets(novo->cor, 20, stdin);
   printf("Digite o nome do proprietario do veiculo: ");
   fgets(novo->proprietario, 50, stdin);
   return novo;
}

void cadastrar(arvore **T, arvore *novo){
   if((*T) == NULL){
           novo->dir = NULL;
           novo->esq = NULL;
           (*T) = novo;
   }
   else{
           if(novo->id == (*T)->id){
               printf("\nVeiculo ja cadastrado!\n");
   }
   else if(novo->id < (*T)->id){
           cadastrar(&((*T)->esq), novo);
   }
   else{
           cadastrar(&((*T)->dir), novo);
   }
   }
  salvaArquivo(*T);
   }

void salvaArquivo(arvore *T){
   FILE *arq;
   arq = fopen("arquivo.txt","w");
   salvaItem(T,arq);
   fclose(arq);
}

void salvaItem (arvore *T, FILE *arq){
   fwrite(&T->id,sizeof(int),1,arq);
   fwrite(&T->marca,sizeof(char),31,arq);
   fwrite(&T->modelo,sizeof(char),31,arq);
   fwrite(&T->cor,sizeof(char),31,arq);
   fwrite(&T->proprietario,sizeof(char),31,arq);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

O problema é que quando compilo, aparece o seguinte:

warning: conflicting types for 'salvaArquivo' [enabled by default]|

warning: conflicting types for 'salvaItem' [enabled by default]|

Onde estou errando?

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Todas as funcoes tem de ser conhecidas pelo compilador antes de serem chamadas.

No teu caso -- nao sao.

Por isso o compilador assume certas coisas, por exemplo que as funcoes devolvem um int.

Mais tarde, quando defines as funcoes, nao as defines como devolvendo um int, indo contra o que o compilador assumiu e originando o warning.

Solucao 1: fornece um prototipo para as funcoes antes de as chamar

Solucao 2: altera a ordem da definicao das funcoes, para que todas as funcoes estejam definidas antes de serem chamadas (uma definicao serve como prototipo)

Editado por pmg
  • Voto 1

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jett

Todas as funcoes tem de ser conhecidas pelo compilador antes de serem chamadas.

No teu caso -- nao sao.

Por isso o compilador assume certas coisas, por exemplo que as funcoes devolvem um int.

Mais tarde, quando defines as funcoes, nao as defines como devolvendo um int, indo contra o que o compilador assumiu e originando o warning.

Solucao 1: fornece um prototipo para as funcoes antes de as chamar

SOlucao 2: altera a ordem da definicao das funcoes, para que todas as funcoes estejam definidas antes de serem chamadas (uma definicao serve como prototipo)

Deu certinho agora, obrigada!

Outra dúvida que tenho:

Inseri os dados como ID: 1

marca: ford

modelo: ka

cor: branco

proprietario: marcos

mas quando abro o arquivo aparece o seguinte:

  ford
TERNAME=ADMINISTRADOR ComSpec=C:ka
xe FP_NO_HOST_CHECK=NO HOMEbranco
ssica LOCALAmarcos
:\Umarcos
:\Users\Administrador\AppData

Como faço para gravar de um jeito que fique sem essas variáveis do sistema?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Em vez de fwrite(), usa fprintf()

void salvaItem (arvore *T, FILE *arq){
   fprintf(arq, "%d|%s|%s|etc\n", T->id, T->marca, T->modelo/*, etc*/);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

O que te esta a aparecer no ficheiro é o lixo que ficou depois do '\0' dos inputs


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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jett

Agora estou tentando arquivar no arquivo de modo ordenado, mas não está dando certo:

void salvaItem (arvore *T, FILE *arq){
   fprintf(arq, "ID: %d\nMARCA: %sMODELO: %sCOR: %sPROPRIETARIO: %s\n", T->id, T->marca, T->modelo, T->cor, T->proprietario);
   if(T->esq)salvaItem(T->esq,arq);
   if(T->dir)salvaItem(T->dir,arq);
}

void salvaArquivo(arvore *T){
   salvaArquivo(T->esq);
   FILE *arq;
   arq = fopen("arquivo.txt","w");
   salvaItem(T,arq);
   fclose(arq);
   salvaArquivo(T->dir);
}

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Tens que 'recursar' tudo à esquerda antes de imprimir o nó.

Basta-te trocar a ordem das duas primeiras instruções :)

void salvaItem (arvore *T, FILE *arq){
   if(T->esq)salvaItem(T->esq,arq);
   fprintf(arq, "ID: %d\nMARCA: %sMODELO: %sCOR: %sPROPRIETARIO: %s\n", T->id, T->marca, T->modelo, T->cor, T->proprietario);
   if(T->dir)salvaItem(T->dir,arq);
}

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.