Olá Junior. Então...  Fiz o que você indicou, e o processo de gravação tah dando certo. O problema é na função que exibe o conteúdo do arquivo, ela está sempre duplicando o último registro. Se eu cadastro, um exemplo, Maria, e gravo no arquivo, na hora de imprimir na tela o registro aparece duas vezes. Isso só acontece com o último registro cadastrado. Ou seja o problema não é no arquivo, nem na gravação e sim na função que a exibe.   Obrigado. Segue o código:   ---------------------------GRAVANDO NO ARQUIVO-----------------------------   void gravaNoArquivo(){
     int op=1;
     celula *elemento;
FILE *arq;
arq=fopen ("agenda.dat", "a+b"); 
if (! arq )
printf (" Erro ao abrir arquivo !");
 else{
       while (op!=0){
       elemento=malloc(sizeof(celula));
       if(elemento==NULL){
       printf("\nErro ao Alocar!");                    
       }else{
        if(cabeca->tamanho==0)
          elemento->proximo=NULL;          
        else
         elemento->proximo = cabeca->inicio;
                               
        cabeca->inicio=elemento;
        cabeca->tamanho++;           
        
        getchar();
        printf("\nDigite o nome:" );
        gets(elemento->dados.nome);
        
        printf("\nDigite o Numero do Telefone: ");
        scanf("%d", &elemento->dados.telefone);
        
                
             fwrite (&elemento->dados, sizeof (struct informacoes), 1, arq );
             printf (" Deseja gravar mais dados (1/0)? ");
             scanf ("%d", &op );
        }
       }
        fclose (arq);
 }
}
---------------------------LENDO O ARQUIVO-----------------------------
void lerArquivo(){
     struct provisorio
     {
       long int telefone;
       int cod_area;
       char nome[50], cidade[20], obs[200];       
     };
typedef struct provisorio repositorio;
repositorio repo;
     
     FILE *arq;
     arq= fopen ("agenda.dat", "rb");
     
     if (! arq )
     printf ("Erro ao abrir arquivo !");
   else{
     printf ("\n*** Agenda - Relatorio ***\n");
     
     do{
     /* o dado é lido e armazenado na estrutura */
     fread (&repo , sizeof (repositorio), 1, arq );
     printf ("\nNome: %s", repo.nome );
     printf ("\tFone: %ld\n\n", repo.telefone );
     }while (!feof(arq));
     fclose (arq);
   }
}