Gravar struct em arquivo binario e texto em C

Boa noite gente! to com dois probleminhas:
1)Minha pesquisa sempre diz que o elemento está na árvore, isso só acontece após a primeira pesquisa, se for antes ele diz que não existe (se não existir mesmo).
2)Não estou conseguindo gravar o conteudo da struct nos arquivos.

Obrigadinhaa!

Abaixo pequenas correções que pude identificar, porém acho que do jeito que está irá gravar somente uma struct e não todas as relacionadas. O tamanho gravado ‘sizeof’ só atende uma e os pointers dos relacionados esquerda e direita, sem seu conteúdo.

void stexto () { FILE *arquivo_texto; arquivo_texto = fopen ("arquivo_texto.txt", "a"); //creio que aqui seja somente a de 'append', o modo txt é o padrão já if (arquivo_texto == NULL) { printf("Erro ao abrir o arquivo.\n"); exit(1); } //%s string //%d integer fprintf(arquivo_texto, "%d %s %2f\n", raiz->cod, raiz->nome, raiz->preco); // '->' e não '.', pois raiz é um pointer fclose(arquivo_texto); }

void sbinario () { // sem a struct... FILE *fp; fp = fopen ("Binario", "ab"); //correto, ab para append e binario if (fp == NULL) { printf ("Erro ao abrir o arquivo.\n"); exit(1); } else { //if (fp != NULL) {} printf ("Arquivo Binario criado com sucesso.\n"); fseek(fp, 0, SEEK_SET); fwrite(&raiz, sizeof(struct PERFUME), 1, fp); fclose (fp); } }

Ah, o retorno do ‘fwrite’ é o tamanho do que foi gravado, então você pode utilizar como teste para saber se realmente houve sucesso na gravação.

Não ajudou muito mas já é um começo,
boa sorte!

Oi Tudo bem?

Eu implementei uma função que imprime o arquivo binário, veja se ajuda:

#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>  
  
struct PERFUME {  
    struct PERFUME *esq, *dir;   
    int cod;   
    char nome[30];  
    float preco;   
    }  *raiz = NULL,*aux = NULL;   
      
typedef struct PERFUME *arvore_ptr;   
  
//prototipos para passar para o outro arquivo  
void Inserir (arvore_ptr*, int, char[], float);   
void Pesquisar (arvore_ptr, int);   
  
  
/*int c = codigo char n[] = nome[30] float preco = p*/  
void Inserir (arvore_ptr *pai, int c, char n[], float p) {  
    if ((*pai)) {   
        if (c < (*pai) -> cod)  
           Inserir(&((*pai) -> esq), c, n, p);   
        else  
           Inserir(&((*pai) -> dir), c, n, p);  
    }  
    else {   
        (*pai) = (arvore_ptr) malloc (sizeof (struct PERFUME));   
            if (*pai) {   
                  (*pai) -> cod = c;   
                   strcpy((*pai) -> nome, n);  
                  (*pai) -> preco = p;  
                  (*pai) -> esq = NULL;   
                  (*pai) -> dir = NULL;  
            }  
        }  
}  
  
void Pesquisar (arvore_ptr raiz, int c) {  
    if (raiz) {  
        if (c == raiz-> cod) {   
            printf("codigo = %d\n", raiz -> cod);  
            printf("nome = %s\n", raiz -> nome);  
            printf("preco %d = %.2f\n", raiz -> preco);  
      
            aux = raiz;   
            return;  
        }   
        else {  
            if (c < raiz -> cod)  
                Pesquisar(raiz -> esq, c);   
            else  
                Pesquisar(raiz -> dir, c);  
             }  
    }  
}  
  
void sbinario () {  
   FILE *fp;  
   fp = fopen ("Binario.dat", "ab"); //wb para escrita //rb para leitura  
   if (fp == NULL) {  
      printf ("Erro ao abrir o arquivo.\n");  
      exit(1);  
   }  
   else {  
   //if (fp != NULL) {}  
   printf ("Arquivo Binario criado com sucesso.\n");   
   fwrite(&raiz, sizeof(raiz), 1, fp);  
   fclose (fp);  
   }     
}

/*Função reponsavel por exibir o conteudo do arquivo .dat*/

void imprime(){
     FILE * fp;
     fp = fopen ("Binario.dat", "rb"); 
      if (fp == NULL) {  
      printf ("Erro ao abrir o arquivo.\n");  
      exit(1);  
}
        while(fread(&raiz,sizeof(raiz),1,fp)){
                 
                 printf("%d, %s, %.2f\n",raiz->cod,raiz->nome,raiz->preco);
                 
                }
                  fclose(fp);
         
}  
      
void stexto () {  
   FILE * arquivo_texto; 
   arquivo_texto = fopen ("arquivo_texto.txt", "a"); //duvida aqui se é r ou a  
   if (arquivo_texto == NULL) {  
         printf("Erro ao abrir o arquivo.\n");  
         exit(1);             
   }    
   //%s string //%d integer  
   fprintf(arquivo_texto, "%d %s %2f\n", raiz->cod, raiz->nome, raiz->preco);
   printf("%d %s %2f\n",raiz->cod, raiz->nome, raiz->preco);   
   fclose(arquivo_texto);  
}  
            
int main() {  
    int opcao =1;   
    int entrada;  
    char nome1[30];  
    float p;  
    char temp[30];  
      
        while(opcao!=0) {     
                
              printf("|________________________|\n\n\n\n");  
              printf("=====>Menu<=====\n");  
              printf("________________\n");  
              printf("1-->Inserir\n");  
              printf("2-->Pesquisar\n");  
                          printf("3-->Salvar Binario\n");  
                          printf("4-->Salvar Texto\n"); 
                          printf("5-->Imprimir Texto\n");  
              printf("0-->Sair        \n");  
              printf("________________\n");     
              printf("Opcao:");  
               scanf("%d%*c", &opcao);  
                       
    switch(opcao)  
      {  
          case 1:{  
                   printf("\nDigite o codigo: ");   
                   gets(temp);  
                               entrada = atoi(temp);  
      
                   printf("digite o nome: ");  
                   gets(nome1);  
      
                   printf("digite o preco: ");  
                   gets(temp);  
                   p = atof(temp); //string para float  
                   Inserir(&raiz,entrada, nome1, p);  
                   break;  
                   }  
                 
          case 2:{  
                   printf("\nDigite o codigo: ");   
                   gets(temp);  
                   entrada = atoi(temp); //string para int  
                   Pesquisar(raiz,entrada);   
      
                     if (aux) {  
                        printf("\n %d Existe na arvore\n",entrada);   
                     }  
                     else  
                        printf("\n %d Nao existe na arvore",entrada);   
                   break;  
                   }  
            
          case 3:{  
               sbinario();  
               break;  
               }  
                 
          case 4: {stexto();
          break;
          }
          case 5:{
               imprime();
               break;
               }       
      }   
   }  
} 

[]'s

jamirdeajr: Obrigada pelas correções!
getAdicted: Obrigada pela função, irei testar agora!

beijinhos.

getAdicted:eu executo e o programa fecha =p

Bom, tenho algumas dúvidas ainda gente, esta é uma arvore binária não balanceada, gostaria de depois de fazer com que ela virasse uma avl, balanceada, é muito difícil fazer aquelas rotações (simples e dupla esquerda e direita)?

Outra coisa, também não entendo quando é pré oderm, pós ordem e simetrica.

Obrigadaa!

[quote=Mariana.Vecci]getAdicted:eu executo e o programa fecha =p
[/quote]

Como você está executando esse programa?

Bom, eu insiro alguns dados, salvo no binario e depois digito a opção de imprimir.