Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Andre1989

Estrutura de Dados escrita em ficheiro.dat

Mensagens Recomendadas

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,

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Editado por brunoais
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

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.