gracias por responder, ya corregi sobre fread y fwrite pero aun me sigue botando basura, es decir bota el nombre pero tambien otras direcciones como el escritorio. y cuando quiero agregar otro dato lo reemplaza y cuando se cierra y quiero mostrar  solo me sale una carita :S. 
 
Nose que mas puede ser el problema para este algoritmo e estado intentando todo :S espero que puedan analizarlo para saber la causa. 
gracias    
Código codigo:
Ver original#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <conio.c>
#include <string.h>
#include <math.h>
#include <malloc.h>
 
using std::iostream;
using std::cout;
using std::cin;
using std::endl;
 
 
struct fecha
{
   int dd;
   int mm;
   int aaaa;
};
 
struct direccion
{
   char dir[50];
   char disto[50];
   char dpto[50];
   char pais[50];
};
 
struct persona
{
   char cod[8];
   char ap[20];
   char am[20];
   char nom[50];
   int sex;
   fecha fnac;
   direccion dir;
};
//declaracion de funciones
//************************
int menu();
void lecturapers(persona **p,int *dim);
void mostrarpers(persona *p,int dim);
 
 
//Principal
//*********
int main() 
{   persona *a;
    int opcion,n;
    textbackground(15);
    textcolor(0);
    do{
      system("cls");
      opcion=menu();
      
      switch(opcion)
            {
             case 0: exit(1);
             case 1: system("cls");
                     lecturapers(&a,&n);
                     break;
             case 2: system("cls");
                     mostrarpers(a,n);
                     break;
            }
    }while(opcion);
       
       
       
       
 
      system("PAUSE");
      return 0;
}
 
//Menu de Opciones
//****************
int menu()
{   int op;
    
    cout<<"\n \t\t\t   DIRECTORIO TELEFONICO\n";
    cout<<"\t\t\t    ---------------------\n\n\n";
    cout<<"\t\t\t   [1]Ingresar Datos\n";
    cout<<"\t\t\t   [2]Mostrar Personas\n";
    cout<<"\t\t\t   [0]Salir del directorio\n\n";
    do{
       cout<<"\n\t\t\t   Elige la opcion=";
       cin>>op;
    }while(op<0 && op>8);
    return(op);
 
}
 
//Lectura de datos
//****************
 
void lecturapers(persona **p,int *dim)
{    FILE *F;
     int i;
    /* *p=new (struct persona); */
     *p = (struct persona*) malloc (sizeof (struct persona));   
        
   
     cout<<"Nombre(s):";
     gets((*p)->nom);
     cout<<"Apellido Paterno:";
     gets((*p)->ap);
     F = fopen("D:/trabajo/Agenda.dat","rb+");
     if(F==NULL)
            {
               printf(" No se puede abrir el archivo\n");
               system("pause");
               exit(1);
            }
     fwrite(*p,sizeof(struct persona),1,F);
     printf("\n\n\tDOCENTE ARCHIVADO!!!");
     printf("\n\n\t");
 
     fclose(F);  
     system("pause");
     /*for(i=0;i<3;i++)
     {cout<<"Nombre:";
     gets((*p+i)->nom);}
     *dim=3;
     system("pause");*/
   
  
     
}
 
void mostrarpers(persona *p,int dim)
 
{    FILE *F;
     int i;  
     F = fopen("D:/trabajo/Agenda.dat","rb");
     if(F==NULL)
     {
         printf("\n\tNo se puede abrir el archivo\n");
         exit(1);
     }
     while(!feof(F))
     {
      printf("%s",p->nom);
      printf("\t\t%s",p->ap);
      cout<<"\n\n";
      fread(p,sizeof(struct persona),1,F); 
          
     }
     fclose(F);
     system("pause");
 }