Ir ao conteúdo
  • Cadastre-se

Dificuldade em gravar dados binarios em um sistema de cadastro feito com listas


Lucas Tasca

Posts recomendados

n estou conseguindo gravar os dados binarios na minha estrutura, ela é um sistema de cadastros feita com listas, um maluco me falou para fazer um nova struct mas eu n estou conseguindo

alguem me de uma luz

 

 

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct lista{
     char titulo[1000];
     char autor[1000];
     char subtitulo[1000];
     char desc[1000];
     char ref[1000];
     unsigned long int codigo;
     struct lista* prox;
   }Lista;
 
   //Declaração de funções.
   Lista* inserir_livros(Lista* primeiro);
   void listar_livros(Lista* primeiro);
   Lista* excluir_livros(Lista* primeiro);
   void alterar_livros(Lista* primeiro);
 
int main()
{
   Lista *primeiro= NULL;
   char opcao;
 
 
   //Paranaue para repetir o programa.
   while(opcao!='0')
   {
     //Menu de opções
      printf(" | ");printf("\t\t\t     CADASTRO WIKI");printf("\t\t\t      |\n");
      printf("  MENU   ");
      printf("   ---------------------------- \n");
      printf("   | 1.  Novo cadastro                |\n");
      printf("   | 2.  Listar                       |\n");
      printf("   | 3.  Excluir cadastro             |\n");
      printf("   | 4.  Alterar cadastro             |\n");
      printf("   | 0.  Sair                         |\n");
      printf("   -------------------------------------");
 
 
      //Lendo a opcao do menu
      opcao= getch();
 
      //Menu de opções
      switch(opcao)
      {
         case '1':
              //Inserindo os livros
              fflush(stdin);
              system("cls");
              printf(" | ");printf("\t\t\t          NOVO CADASTRO     ");printf("\t\t\t      |\n");
              primeiro= inserir_livros(primeiro);
         getch();
         system("cls");
         break;
 
         case '2':
              //Listando os livros.
              system ("cls");
              printf(" | ");printf("\t\t\t     LIVROS CADASTRADOS");printf("\t\t\t      |\n");
              listar_livros(primeiro);
         getch();
         system("cls");
         break;
 
         case '3':
 
              //Excluindo livros da lista.
              system ("cls");
              printf(" | ");printf("\t\t\t        EXCLUIR CADASTROS");printf("\t\t\t      |\n");
              primeiro= excluir_livros(primeiro);
         getch();
         system("cls");
         break;
 
         case '4':
 
              //Alterando livros da lista.
              system ("cls");
              printf(" | ");printf("\t\t\t       ALTERAR CADASTRADOS");printf("\t\t\t      |\n");
              alterar_livros(primeiro);
         getch();
         system("cls");
         break;
 
         case '0':
              // para sair do programa.
              opcao='0';
         break;
 
         default:
              //Paranaue que previne o usuário de digitar uma opcão que não exista no menu.
              system€("cls");
         break;
      }
   }
}
 
Lista* inserir_livros (Lista *primeiro){
     Lista livro;
     Lista *atual= primeiro;
     char identificador= 'F';
 
     //Lendo as informações do livro.
     printf("  Titulo: ");
     fwrite(&livro.titulo, sizeof(livro),1000, stdin);fputs(livro.titulo,stdin);fgets(livro.titulo, 1000, stdin); printf ("\n");
     printf("  Subititulo: ");
     fwrite(&livro.subtitulo, sizeof(livro),1000, stdin);fputs(livro.subtitulo,stdin);fgets(livro.subtitulo, 1000, stdin); printf ("\n");
     printf("  Autor: ");
     fwrite(&livro.autor, sizeof(livro),1000, stdin);fputs(livro.autor,stdin); fgets(livro.autor, 1000, stdin); printf ("\n");
     printf("  Descricao: ");
     fwrite(&livro.desc, sizeof(livro),1000, stdin);fputs(livro.desc,stdin);fgets(livro.desc, 1000, stdin); printf ("\n");
     printf("  Referencias: ");
     fwrite(&livro.ref, sizeof(livro),1000, stdin);fputs(livro.ref,stdin);fgets(livro.ref, 1000, stdin); printf ("\n");
     printf("  Codigo: ");
     fscanf(stdin,"%u",&livro.codigo);printf ("\n");
 
     //Verificando se o cadastro já existe.
     for(atual=primeiro; atual!=NULL; atual=atual->prox){
        if(atual->codigo==livro.codigo){
            identificador= 'V';
            break;
        }
     }
 
     if(identificador!='V' && (strlen(livro.titulo)!=1 && strlen(livro.autor)!=1)){
         //Alocando os espaços e guardando as informações do livro.
         Lista* Novolivro=(Lista*) malloc (sizeof(Lista));
         strcpy(Novolivro->titulo, livro.titulo);
         strcpy(Novolivro->subtitulo, livro.subtitulo);
         strcpy(Novolivro->autor, livro.autor);
         strcpy(Novolivro->desc, livro.desc);
         strcpy(Novolivro->ref, livro.ref);
         Novolivro->codigo= livro.codigo;
         Novolivro->prox= primeiro;
         printf("  Cadastro realizado com sucesso.");
         printf("\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
         return Novolivro;
     }else{
         printf("  Cadastro invalido.");
         printf("\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
         return primeiro;
     }
}
 
void listar_livros (Lista* primeiro){
     Lista* atual;//Ponteiro para percorrer a lista sem perder a referência do primeiro elemento da lista.
 
     //Imprimindo os livros da lista, e suas repectivas informações.
     for(atual= primeiro ; atual!= NULL; atual= atual->prox){
        printf("\n  Titulo: ");
        printf("%s", atual->titulo);
        printf("\n  Subtitulo: ");
        printf("%s", atual->subtitulo);
        printf("\n  Autor : ");
        printf("%s", atual->autor);
        printf("\n  Descricao: ");
        printf("%s", atual->desc);
        printf("\n  Referencias: ");
        printf("%s", atual->ref);
        printf("\n  Codigo: " );
        printf("%u", atual->codigo);
        printf("\n\n");
     }
     if(primeiro==NULL)
        printf("  Nenhum livro cadastrado.");
     printf("\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
}
 
Lista* excluir_livros(Lista *primeiro){
 
     Lista *anterior= NULL;//Ponteiro para saber o elemento anterior ao elemento atual da lista.
     Lista *atual= primeiro;//Ponteiro para percorrer a lista sem perder o primeiro elemento da lista.
     unsigned long int codigo=0;
 
     //Requisitando e lendo o código do livro a ser excluído.
     printf("  Codigo do livro a ser excluido: ");
     fscanf(stdin,"%u",&codigo);
 
     //Procurando o livro na lista.
     while(atual!= NULL && atual->codigo!=codigo){
        anterior= atual;
        atual= atual->prox;
     }
 
     //Mensagem caso o livro não seja encontrado.
     if(atual==NULL){
        printf("\n  Livro nao encontrado.");
        printf("\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
        return primeiro;
     }
 
     //Excluindo o primeiro livro da lista.
     if(anterior==NULL){
        printf("\n  Conteudo excluido com sucesso.");
        primeiro= atual->prox;
     //Excluindo um lvro do meio da lista.
     }else{
        printf("\n  Conteudo excluido com sucesso.");
        anterior->prox= atual->prox;
     }
 
     //Desalocando o espaço da memória.
     free(atual);
     printf("\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
     return primeiro;
}
 
//Função para alterar lvro.
void alterar_livros(Lista* primeiro){
     char titulo_substituto[1000];
     char autor_substituto[1000];
     char subtitulo_substituto[1000];
     char ref_substituto[1000];
     char desc_substituto[1000];
     unsigned long int codigo;
     Lista* atual=primeiro;
 
     //Requisitando e lendo o código do livro a ser alterado.
     printf("  Codigo do livro a ser alterado: ");
     fscanf(stdin,"%u",&codigo);
 
     //Procurando o livro na lista.
     while(atual!= NULL && atual->codigo!=codigo){
        atual= atual->prox;
     }
 
     //Alterando os dados do livro.
     if(atual!=NULL){
        printf("\n  Novo Titulo: ");
        fwrite(&titulo_substituto, sizeof(titulo_substituto),1000, stdin);fputs(titulo_substituto,stdin);fgets(titulo_substituto, 1000, stdin);
        strcpy(atual->titulo,titulo_substituto);
        printf("\n  Novo Subtitulo: ");
        fwrite(&subtitulo_substituto, sizeof(subtitulo_substituto),1000, stdin);fputs(subtitulo_substituto,stdin);fgets(subtitulo_substituto, 1000, stdin);
        strcpy(atual->subtitulo,subtitulo_substituto);
        printf("\n  Novo Autor: ");
        fwrite(&autor_substituto, sizeof(autor_substituto),1000, stdin); fputs(autor_substituto,stdin); fgets(autor_substituto, 1000, stdin); printf ("\n");
        strcpy(atual->autor,autor_substituto);
        printf("\n  Nova Descricao: ");
        fwrite(&desc_substituto, sizeof(desc_substituto),1000, stdin);fputs(desc_substituto,stdin);fgets(desc_substituto, 1000, stdin);
        strcpy(atual->desc,desc_substituto);
        printf("\n  Novas Referencias: ");
        fwrite(&ref_substituto, sizeof(ref_substituto),1000, stdin);fputs(ref_substituto,stdin);fgets(ref_substituto, 1000, stdin);
        strcpy(atual->ref,ref_substituto);
        printf("  Dados alterados com sucesso.");
     }else{
        printf("\n  livro nao encontrado.");
     }
     printf("\n\n\n  PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU PRINCIPAL.");
}
 
Link para o comentário
Compartilhar em outros sites

A sintaxe do fwrite é essa:

fwrite (ptr, tam, tamBuffer, arquivo);

 

ptr --> ponteiro que aponta pro buffer/vetor/string que você quer escrever no teu arquivo

tam --> tamanho em bytes de cada item do teu buffer

tamBuffer --> tamanho total do buffer em bytes

arquivo --> ponteiro pro arquivo onde você quer salvar os dados

 

No teu código você tá usando as vezes uns valores estranhos como ponteiro do buffer, por exemplo:

fwrite(&ref_substituto, sizeof(ref_substituto),1000, stdin)

 

Não precisa daquele sinal de & alí.

Além disso, tá usando o stdin como buffer de saída... mas stdin é um buffer de entrada.

 

Deveria ser algo assim:

fwrite(ref_substituto, sizeof(char), sizeof(ref_substituto), ponteiroDoArquivo)

 

Aqui tem um exemplo do fwrite:

http://www.cplusplus.com/reference/cstdio/fwrite/

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!