Jump to content
Andre1989

Estrutura de Dados escrita em ficheiro.dat

Recommended Posts

Andre1989

Boa tarde,

Sou novo por aqui e gostaria de uma ajudinha se fosse possível estou com um problema na escrita de uma estrutura de dados num ficheiro.

O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços.

void SalvarFicheiro(){    //funçao para guardar os dados
   FILE *f;
int i;
   f=fopen(nomeficheiro,"wb");  //abre ficheiro onde sera guardada a estrutura
for(i=0;i<livro;i++)
 fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f);
flag = 1;
system("PAUSE");
system("cls");
if(flag == 1)
 printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro);
else
 printf("Nao existem ficheiros actualmente abertos!\n\n");
Menu();
}

//-------------------------------ESTRUTURA DOS LIVROS----------------------------------//
typedef struct{
char ISBN[50];
char Titulo[50];
char Idioma[50];
char Autor[50];
char Editora[50];
char AnoDePublicacao[4];
char Preco[50];
char NumeroPaginas[5000];
char Quantidade[5000];
} LIVRO;
LIVRO biblioteca[numerolivros];
int livro = 0;

Cumprimentos,

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
pmg

O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços.

for(i=0;i<livro;i++)
 fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f);

Este loop com o fwrite vai escrever varias vezes a biblioteca completa.

Cada ciclo escreve uma biblioteca completa.

Edited by 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!

Share this post


Link to post
Share on other sites
Andre1989

Sim e sem o FOR, o resultado era o mesmo! :S

Ja tentei escrever os dados do ficheiro na consola e dá o mesmo problema

Share this post


Link to post
Share on other sites
pmg

//-------------------------------ESTRUTURA DOS LIVROS----------------------------------//
typedef struct{
char ISBN[50];
char Titulo[50];
char Idioma[50];
char Autor[50];
char Editora[50];
char AnoDePublicacao[4];
char Preco[50];
char NumeroPaginas[5000];
char Quantidade[5000];
} LIVRO;

Xiiiiiiiiiiiiii ... porque 5000 bytes para o numero de paginas, e o mesmo para a quantidade, e 50 bytes para preco???

Nao queres rever esta estrutura?

Sugestao

//-------------------------------ESTRUTURA DOS LIVROS----------------------------------//
typedef struct{
   char ISBN[50];
   char Titulo[50];
   char Idioma[50];
   char Autor[50];
   char Editora[50];
   int AnoDePublicacao;
   unsigned PrecoCentimos; /* dividir por 100 para preco em Euros */
   int NumeroPaginas;
   int Quantidade;
} LIVRO;

Sem meteres aqui o codigo que actualiza a biblioteca 'e impossivel saber o que esta mal.


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!

Share this post


Link to post
Share on other sites
Andre1989

Este é o codigo onde eu insiro um novo livro:

LIVRO InserirLivro(){
LIVRO novo;
if (nomeficheiro[30] == 0){
 printf("Para inserir um livro tera de criar/abrir um novo ficheiro!!\n\n");
 system("PAUSE");
 system("cls");
 if(flag == 1)
   printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro);
  else
   printf("Nao existem ficheiros actualmente abertos!\n\n");
 Menu();
}
else{
printf("\nIntroduza o ISBN do livro: ");
fgets(novo.ISBN, 50 , stdin);
printf("\nIntroduza o titulo do livro que deseja introduzir: ");
fgets(novo.Titulo, 50 , stdin);
printf("\nIntroduza o idioma do livro: ");
fgets(novo.Idioma, 50 , stdin);
printf("\nIndrotuza o nome do autor: ");
fgets(novo.Autor, 50 , stdin);
printf("\nIntroduza o nome da editora: ");
fgets(novo.Editora, 50 , stdin);
printf("\nIntroduza o ano de publicacao: ");
fgets(novo.AnoDePublicacao, 50 , stdin);
printf("\nIntroduza o preco do livro: ");
fgets(novo.Preco, 50 , stdin);
printf("\nIntroduza o numero total de paginas: ");
fgets(novo.NumeroPaginas, 50 , stdin);
printf("\nIntroduza a quantidade em stock: ");
fgets(novo.Quantidade, 50 , stdin);
livro++;
printf("\n\nLIVRO INSERIDO NA BASE DE DADOS COM SUCESSO!!\n\n");
   return(novo);
}
}

Depois esta função vai ser chamada mais em baixo no menu de ficheiros:

void MenuLivros(){
int opc;
   printf("\n");
printf(" #----------------LIVROS----------------#\n");
printf(" | Inserir      --->           Opcao 1  |\n");
printf(" | Remover      --->           Opcao 2  |\n");
printf(" | Consultar    --->           Opcao 3  |\n");
printf(" | Editar       --->           Opcao 4  |\n");
printf(" | Ordenar      --->           Opcao 5  |\n");
printf(" | Voltar atras --->           Opcao 6  |\n");
printf(" #--------------------------------------#\n");
printf("\n");
printf("Digite uma das opcoes:");
scanf("%d",&opc);
fflush(stdin);
switch (opc){
       case 1:
  biblioteca[livro] = InserirLivro();
  Mostralivro(biblioteca[livro]);
  SalvarFicheiro();
  system("PAUSE");
  system("cls");
  if(flag == 1)
   printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro);
  else
   printf("Nao existem ficheiros actualmente abertos!\n\n");
  Menu();
           break;
       case 2:

           break;
       case 3:
  MenuConsultas();
           break;
 case 4:
  break;
 case 5:
  break;
 case 6:
  system("cls");
  if(flag == 1)
   printf("Ficheiro actualmente aberto: %s\n\n",nomeficheiro);
  else
   printf("Nao existem ficheiros actualmente abertos!\n\n");
  Menu();
  break;
       default:
           printf("Opcao invalida\n");
   }
}

Em relação a estrutura, sim já melhorei como mencionou :)

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
pmg

Aqui, em MenuLivros(), esta uma coisa que eu nao gosto nada, nada, nada!!

   biblioteca[livro] = InserirLivro();

Repara que a funcao InserirLivro() altera o valor da vraiavel global livro; e usas o valor dessa varaiavel --- antes ou depois da alteracao??? --- para copiar o livro para a biblioteca.

Acaba com as variaveis globais! Elas geram mais problemas do que os que 'aparentemente' resolvem.

Como eu faria a insercao dum livro sem mudar muito o teu codigo era fazer a funcao InserirLivro() nao precisar de saber o numero do livro e actuzalizar livro na copia

/* livro nao 'e variavel global!!! */
  biblioteca[livro++] = InserirLivro(); /* InserirLivro nao altera `livro` */

ou

   biblioteca[livro++] = InserirLivro(); /* InserirLivro nao altera `livro` */
  livro++;


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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

estou com um problema na escrita de uma estrutura de dados num ficheiro.

O problema é que quando tento escrever para o ficheiro, apenas me escreve espaços.

 // ...
 f=fopen(nomeficheiro,"wb");                              // ficheiro binário
 for(i=0;i<livro;i++)
   fwrite(&biblioteca,sizeof(biblioteca[livro]),livro,f); // escrita de valores binários

ficheiros binários não são para ser abertos por um editor de texto.

apesar de te aparecerem espaços, não quer dizer que não tenham informação !!!

da seguinte tabela, diz quantos caracteres existem com valor abaixo de 30 e com representação gráfica de um símbolo ? : http://www.asciitable.com/


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.