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

Angel_Snake

Problema ao ler ficheiro

5 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

      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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Mais uma vez obrigado.

0

Partilhar esta mensagem


Link 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