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

rkixa

[Ajuda] Ficheiro Binário

Mensagens Recomendadas

rkixa

Boas,

Estou a tentar fazer um programa que faça registos de pessoas para um ficheiro binário e que depois os possa listar mas já estou farto de dar aqui voltas e não dou com o problema!

O programa está a compilar sem erros e chega ao fim mas não faz o que quero.

#include <stdio.h>
#include <string.h>

struct registo{
 int dia, mes, ano;
 char nome[200];
 char comentario[200];
};

int insere_registo(char ficheiro[], struct registo log)
{
 FILE *f;
 FILE *g;

 struct registo aux;
 int adicionado = 1;

 printf("3\n");

 f = fopen(ficheiro, "rb");
 g = fopen("novo.dat", "ab");

 if(f == NULL && g == NULL)
 {
   printf("Erro no acesso ao ficheiro\n");
   return 0;
 }

 printf("4\n");

 while(fread(&aux, sizeof(struct registo), 1, f) == 1)
 {

   if (strcmp(aux.nome, log.nome) < 0)
   {
     fwrite(&aux, sizeof(struct registo), 1, g);
   }
   else
   {
     if (adicionado)
     {
fwrite(&log, sizeof(struct registo), 1, g);
fwrite(&aux, sizeof(struct registo), 1, g);
adicionado--;
     }
     else
     {
fwrite(&aux, sizeof(struct registo), 1, g);
     }
   }
 }

 printf("5\n");

 fclose(f);
 fclose(g);

 remove(ficheiro);
 rename("novo.dat", ficheiro);

 printf("6\n");

 return 0;
}

int lista_registo(char ficheiro[])
{
 FILE *f;
 struct registo aux;

 f = fopen(ficheiro, "rb");

 printf("8\n");

 if(f==NULL)
 {
   printf("Erro no acesso ao ficheiro\n");
   return 0;
 }

 printf("9\n");

 while(fread(&aux, sizeof(struct registo), 1, f) == 1)
 {
   printf("aaaaa");
   printf("%s / %d / %d / %d / %s\n", aux.nome, aux.dia, aux.mes, aux.ano, aux.comentario);
 }

 fclose(f);

 printf("10\n");

 return 0;
}

int main()
{
 struct registo log;

 printf("Insira o nick: ");
 fgets(log.nome, 200, stdin );

 printf("nome: %s\n", log.nome);

 printf("Insira o dia: ");
 scanf("%d", &log.dia);

 printf("Insira o mes: ");
 scanf("%d", &log.mes);

 printf("Insira o ano: ");
 scanf("%d", &log.ano);

 printf("Insira o log: ");

 printf("1\n");

 fgets(log.comentario, 200, stdin);

 printf("log: %s\n", log.comentario);

 printf("2\n");

 insere_registo("logbook.dat", log);

 printf("7\n");

 lista_registo("logbook.dat");

 printf("FIM");

 return 0;
}

Tenho vários printf para tentar fazer o debug, o único problema que vejo é ele parecer escrever no ficheiro mas não ler o conteudo.

Agradeço qualquer ajuda que possam dar ;)

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Não estive a ver o teu código todo, mas tenho alguns comentários a fazer:

  • A indentação não existe. Espero que seja por causa de algum bug do editor de código daqui do fórum...
  • Estás a misturar utilizações de scanf com fgets, o que tipicamente dá asneira (como é o caso).
  • Não estás a inicializar a estrutura presente em log (é só lixo lá). E já agora, o campo nome precisa mesmo de 200 caracteres?
  • Mudando tudo para usar scanf, é boa ideia acrescentar um espaço antes da string de formato, que indica ao scanf que deve passar por cima de todo o whitespace presente no buffer (as \n, por exemplo) que fazia com que fosse impossível preencher o campo comentario.
  • Na função insere_registo, estás a abrir um ficheiro logbook.dat que não existe (logo, f == NULL). No entanto, tu só abortas o programa se tanto f como g forem NULL. Ora, g dificilmente será NULL, porque as flags ab implicam a criação do ficheiro caso ele não exista. O teu programa prossegue com um f inválido e crasha logo de seguida. O que é suposto acontecer quando "logbook.dat" não existe?

Não vi além disto, pelo menos para já.

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rkixa

Não estive a ver o teu código todo, mas tenho alguns comentários a fazer:

  • A indentação não existe. Espero que seja por causa de algum bug do editor de código daqui do fórum...
  • Estás a misturar utilizações de scanf com fgets, o que tipicamente dá asneira (como é o caso).
  • Não estás a inicializar a estrutura presente em log (é só lixo lá). E já agora, o campo nome precisa mesmo de 200 caracteres?
  • Mudando tudo para usar scanf, é boa ideia acrescentar um espaço antes da string de formato, que indica ao scanf que deve passar por cima de todo o whitespace presente no buffer (as \n, por exemplo) que fazia com que fosse impossível preencher o campo comentario.
  • Na função insere_registo, estás a abrir um ficheiro logbook.dat que não existe (logo, f == NULL). No entanto, tu só abortas o programa se tanto f como g forem NULL. Ora, g dificilmente será NULL, porque as flags ab implicam a criação do ficheiro caso ele não exista. O teu programa prossegue com um f inválido e crasha logo de seguida. O que é suposto acontecer quando "logbook.dat" não existe?

Não vi além disto, pelo menos para já.

Já é uma boa ajuda vou ver o que consigo! ;)

Quanto à indentação existe sim mas não aqui no editor do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Vê lá então :) Não te esqueças de compilar com warnings (e eu gosto de seguir o standard C99, outros poderão ter outros gostos): gcc -Wall -Wextra -pedantic -std=c99 ...

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.