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

Angel_Snake

Problema ao ler ficheiro

Recommended Posts

Angel_Snake

Olá. Sou novo aqui no fórum e ainda um pouco noob na linguagem c, por isso aqui estou a pedir-vos ajuda :confused:

Estou a ter uns problemas ao ler a partir de um ficheiro de texto. Fiz uma função que recebe um parâmetro. Se este for igual a 1, le o(s) ficheiro(s) que abriu, se for 2, grava.

Aqui está a função:

void Acesso_Fic(int le_grava)
{
   FILE *Contact, *Event;
   int i=0;

   Contact = fopen(NOME_FIC_C, "r+");
   Event = fopen(NOME_FIC_E, "r+");
   if ((Contact == NULL) || (Event == NULL))
   {
      Contact = fopen(NOME_FIC_C, "w+");
      Event = fopen(NOME_FIC_E, "w+");
      if ((Contact == NULL) || (Event == NULL))
      {
         printf("Erro de Ficheiro: Impossivel abrir ou criar ficheiro(s)!\n");
         system("pause");
         exit(1);
      }
   }
   if (le_grava == 1)
   {

      while (fgetc(Contact)!=EOF)
      {
         fgets(CONTACTO[i].Nome, MAX_CHAR, Contact);
         fgets(CONTACTO[i].Morada, MAX_CHAR, Contact);
         fgets(CONTACTO[i].Email, MAX_CHAR, Contact);
         fscanf(Contact, "%d", &CONTACTO[i].Num_tel);
         fscanf(Contact, "%d-%d-%d", &CONTACTO[i].D_Nasc);
         CONTACTO[i].Apagado = 0; i++;
      }
      i = 0;
      while (fgetc(Event)!=EOF)
      {
         fgets(EVENTO[i].Descricao, MAX_CHAR, Event);
         fscanf(Event, "%d", &EVENTO[i].freq);
         fscanf(Event, "%d", &EVENTO[i].hora);
         fscanf(Event, "%d", &EVENTO[i].min);
         fscanf(Event, "%d-%d-%d", &EVENTO[i].marcacao);
         EVENTO[i].Apagado = 0; i++;
      }
   }
   else if (le_grava == 2)
     for (i=0; i<MAX_REGS; i++)
       if (!CONTACTO[i].Apagado)
       {
          fprintf(Contact, "%s\n", CONTACTO[i].Nome);
          fprintf(Contact, "%s\n", CONTACTO[i].Morada);
          fprintf(Contact, "%s\n", CONTACTO[i].Email);
          fprintf(Contact, "%d ", CONTACTO[i].Num_tel);
          fprintf(Contact, "%d-%d-%d\n", CONTACTO[i].D_Nasc);
       }
       else if (!EVENTO[i].Apagado)
       {
          fprintf(Event, "%s\n", EVENTO[i].Descricao);
          fprintf(Event, "%d ", EVENTO[i].freq);
          fprintf(Event, "%d ", EVENTO[i].hora);
          fprintf(Event, "%d ", EVENTO[i].min);
          fprintf(Event, "%d-%d-%d\n\n", EVENTO[i].marcacao);
       }
   fclose(Contact);
   fclose(Event);
}

As estruturas que estou a usar são estas:

typedef struct Datas
{
   int Dia, Mes, Ano;
} DATA;

struct Pessoas
{
   char Nome[MAX_CHAR], Email[MAX_CHAR], Morada[MAX_CHAR];
   DATA D_Nasc;
   int Num_tel, Apagado;
} CONTACTO[MAX_REGS];

struct Eventos
{
   char Descricao[MAX_CHAR];
   DATA marcacao;
   int Apagado, hora, min, freq;
} EVENTO[MAX_REGS];

Quando chamo a função para gravar, corre tudo bem, mas ao tentar ler, o Windows fecha-me o programa com um erro do tipo "Agenda1 deixou de funcionar".

O programa compila sem qualquer tipo de erro ou warning.

O ficheiro depois de gravar fica com este aspecto (ficheiro para os Contactos):

Eduardo Vieira
Rua dos Pinheiros
Edu@Vieira.pt
978711200 12-12-1980
Marco ...
Rua ...
Marco@...
23456 12-12-1990
...

E continuava se mais contactos houvesse.

Alguém me pode ajudar neste problema?

Share this post


Link to post
Share on other sites
pmg

      while (fgetc(Contact)!=EOF)
      {
         fgets(CONTACTO[i].Nome, MAX_CHAR, Contact);
         fgets(CONTACTO[i].Morada, MAX_CHAR, Contact);
         fgets(CONTACTO[i].Email, MAX_CHAR, Contact);
         fscanf(Contact, "%d", &CONTACTO[i].Num_tel);
         fscanf(Contact, "%d-%d-%d", &CONTACTO[i].D_Nasc);
         CONTACTO[i].Apagado = 0; i++;
      }

Neste pedaço de source tens um erro que devia fazer o programa não compilar.

O scanf para a data de nascimento pede 3 variáveis ("%d-%d-%d"), mas só fornece 1 (&CONTACTO[ i].D_Nasc).

Além disso o fgetc(Contact)!=EOF que controla o ciclo "gasta-te" um caracter.


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
Angel_Snake

Que grande erro. Nem tinha reparado nesse pormenor... Obrigado pmg.

Já agora, alguma sugestão para detectar final de ficheiro?

Share this post


Link to post
Share on other sites
pmg

Tanto o fgets como o fscanf (como o fgetc) devolvem um valor.

Esse valor indica se alguma coisa correu mal ...

fgets ==> NULL ==> final de ficheiro ou erro

fgetc ==> EOF ==> fim de ficheiro ou erro

fscanf ==> EOF ==> fim de ficheiro

Verifica sempre o valor devolvido pelas funções da biblioteca standard.


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
Angel_Snake

OK, vou experimentar as tuas sugestões. Depois digo como correm.

Mais uma vez obrigado.

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

×

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.