Jump to content
rkixa

[Ajuda] Ficheiro Binário

Recommended Posts

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

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other 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á.

Edited by pwseo

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

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