• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sandro_G

Ficheiros Binários

7 mensagens neste tópico

Boas pessoal... Tive de fazer um trabalho pa UNI que simula-se uma livraria..Da primeira vez tudo bem, mas agora é pedido pa gravar a informação em ficheiro binário para depois poder ser acedida. Ora o prof pouco deu sobre isso, já tive a googlar, ka vi aqui pelo forum mas nao consigo entender bem como é que faço para gravar e ler a informação correctamente, pois a informação é guardada (pois quando faço "cat ficheirobinário" ele mostra-m o que guaradei lá mas tem muito lixo), mas nao lida correctamente. Fica o código abaixo do programa bastante simplificado, pois o qie interessa é mesmo gravar a informação das estruturas nos ficheiros binários... Agradecia ajuda....

/* Programa que simula um sistema simplificado de gestão de livros numa livraria */
#include <stdio.h>
#include <string.h>
#define DIM 4
#define DIMAUTOR 6


typedef struct livro
{
char isbn [16]; 
char nome [26]; 
char autor [DIMAUTOR][26]; /* Matriz que permite armazenar mais que um autor para um livro */
int numautor;
int quant;
}LIVROS;


/* Funçao que substitui o \n que a funçao fgets armazena na string, por um \0  */
void tira_enter (char palavra[])
{
   palavra[strlen(palavra)-1]='\0';
   
}



/* Função que "apaga" um livro. Também aproveitada para inicializar o vector de estruturas */
void apagar(LIVROS livros[], int i)
{
int j=0;
livros[i].quant=0;
livros[i].numautor=0;
strcpy(livros[i].isbn,"vazio");
strcpy(livros[i].nome,"vazio");
for (j=0;j<=DIMAUTOR-1;j++)
   {
   strcpy(livros[i].autor[j],"vazio");
   }
}


/* Função main */
int main()
{
int i=0;
int j=0;
int k=0;
int numlivros=0;
int numespacos=0; /* variavel utilizada para armazenar o numero de espaços necessarios para que as tabelas fiquem visualmente bem elaboradas */
int opcao=0;
LIVROS livros [DIM];
FILE *filep;

filep=fopen("Dados.DAT","ab");

/* Inicializa todas as posiçoes da estrutura */
for (i=0;i<=DIM-1;i++)
   {
   apagar(livros,i);
   }

printf ("\n\t\t\t******GESTÃO DE LIVROS******");

do
   {
   i=0; /* Em cada novo ciclo a variável "i" toma o valor 0, de forma a que o programa corra correctamente */
   k=0;  
   j=0;
   /* Apresentaçao do Menu */
   do
      {      
      printf ("\n\n Prima:");
      printf ("\n -----------------------------------------");
      printf ("\n|1 - Inserir um novo livro                |");
      printf ("\n -----------------------------------------");
      printf ("\n|2 - GUARDAR                              |");
      printf ("\n -----------------------------------------");
      printf ("\n|3 - LER                                  |");
      printf ("\n -----------------------------------------");
      printf ("\n|4 - Listar todos os livros               |");
      printf ("\n -----------------------------------------");
      printf ("\n|9 - Sair                                 |");
      printf ("\n -----------------------------------------\n");
      scanf ("%d",&opcao);
      getchar();
      }while ( ((opcao<1)||(opcao>5)) && (opcao!=9) );

   switch (opcao)
      {
      case 1:
         if (numlivros<=DIM-1)
            {
            do
               {
               printf ("\nISBN do livro:");
               fgets (livros[numlivros].isbn,16,stdin); 
               tira_enter (livros[numlivros].isbn);
               /* Vai verificar se o ISBN já existe */
               while( (strcmp(livros[i].isbn,livros[numlivros].isbn)!=0) && (i<=numlivros-1) ) 
                  {
                  i++;
                  }
               if (i<=numlivros-1)
                  {
                  printf ("\nISBN já existente. Por favor escolha outro diferente.\n");
                  }
               } while (i<=numlivros-1);
  
            printf ("\nNome do livro:");
            fgets (livros[numlivros].nome,26,stdin);
            tira_enter (livros[numlivros].nome);
            
            do
               {
               printf ("\nNúmero de autores do livro:");
               scanf ("%d",&livros[numlivros].numautor);
               getchar();
               } while ( (livros[numlivros].numautor<1) || (livros[numlivros].numautor>6) );
            /* Ciclo para a possibilidade de haver mais de 1 autor */
            for (j=0;j<=livros[numlivros].numautor-1;j++) 
               {
               printf ("\n%dº Autor do livro:",j+1);
               fgets (livros[numlivros].autor[j],26,stdin);
               tira_enter (livros[numlivros].autor[j]);
               }            

            do
               {
               printf ("\nQuantidade de livros:");
               scanf ("%d",&livros[numlivros].quant);
               } while( (livros[numlivros].quant<0) || (livros[numlivros].quant>=2147483647) ); /* 2147483647 - maior inteiro positivo */ 

            printf ("\nLivro registado com sucesso.");
            numlivros=numlivros+1; /* Actualiza o numero de livros registados */
            }
         else
            {
            numlivros=DIM;
            printf ("\nNão é possível introduzir mais nenhum livro. Se o pretende realmente fazer, por favor apague algum primeiro.");
            } 
         break;
      

      case 2:
          for (i=0;i<=numlivros;i++)
             {
             fwrite(&livros[i],sizeof(LIVROS),1,filep);
             }
          break;


      case 3:
         for (i=0;i<=DIM-1;i++)
            {
            fread(&livros[i],sizeof(LIVROS),1,filep);
            //if (xpto!=DIM)
              // {
               //printf ("\nSó foi possível ler %d elementos",xpto);
               //}
            }
         printf ("\n\n **************Lista de livros**************");
         printf ("\n -------------------------------------------");
         printf ("\n|Nome                                       |");
         printf ("\n -------------------------------------------");
         for (i=0;i<=DIM-1;i++)
            {
            printf ("\n|%s                                       |",livros[i].nome);
            printf ("\n -------------------------------------------");
            }
         break;


      case 4: 
         
         if (numlivros!=0)
            {
            printf ("\n\n **************Lista de livros**************");
            printf ("\n -------------------------------------------");
            printf ("\n|ISBN            |Nome                      |");
            printf ("\n -------------------------------------------");
            for (i=0;i<=numlivros-1;i++)
               {
               printf ("\n|%s",livros[i].isbn);
               numespacos=15-strlen(livros[i].isbn);
               for (j=0;j<=numespacos;j++)
                  {
                  printf (" ");
                  }
               printf ("|%s",livros[i].nome);
               numespacos=25-strlen(livros[i].nome);
               for (j=0;j<=numespacos;j++)
                  {
                  printf (" ");
                  }
               printf ("|");
               printf ("\n -------------------------------------------");
               }
            }
         else 
            {
            printf ("\nDe momento não existe nenhum livro registado. Operação inválida.");
            }
         break;       

      }

   } while(opcao!=9);

fclose(filep);
   
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em que faculdade andas? No meu 1º ano fiz um trabalho parecido ao teu para gerir uma biblioteca. :)

Se quiseres ver o source-code manda-me uma PM que eu envio-to. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando usas o fopen no teu código já estás a abrir o ficheiro para uma escrita binária (com o último parâmetro "ab" estás a dizer que queres fazer a - "append", ou seja acrescentar ao fim do ficheiro e b - "binary"). Ao abrires o ficheiro gravado com um editor de texto parece-te que é lixo mas na verdade o que estás a guardar não é texto e como tal é normal que te parece que é lixo. Podes ler o teu ficheiro com um fopen em que o último parâmetro é "rb" e retirar todos os campos que guardaste previamente e verificar que o ficheiro está correctamente gravado. Vê mais informações sobre o fopen aqui: http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Thnaks pelas ajudas mas já tá resolvido..O Hipnoted ajudou....

Cumps a todos.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas people.....

Estive a pesquisar mas nao encontrei....Alguem sabe como é que testa se existe um ficheiro ou não...Eu vou explicar melhor..No meu trabalho pretendo por que xpto livros foram carregados com sucesso antes do menu. No entanto, não fica bonito da primeira vez que crio o ficheiro dizer que 0 livros foram carregados com sucesso. Mas também não queria apenas criar uma condição de que se fosse 0 para não dar qualquer mensagem, pois se porventura o ficheiro possuir dados e não os carregar te que se avisar o utilizador que os dados nao foram carregados... Não sei se me estou a fazer entender...Mas quem percebeu se me pudesse ajudar agradecia...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma forma simples é tentares abrir o ficheiro em modo de leitura (este modo não cria o ficheiro caso ele não exista) e verificas se consegues abrir o ficheiro ou não.

FILE * f = fopen("coiso.txt" , "r" );
if ( f == NULL )
{
     // ficheiro não existe...
}

Nota que podem existir outros motivos para não conseguires abrir o ficheiro, mas para esse trabalho, os profs não devem implicar :)

0

Partilhar esta mensagem


Link 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