求教一个有关c++文件输入输出的有关问题

求教一个有关c++文件输入输出的问题
最近我编写了一个同学录的程序  
在测试其中文件的存取函数时发现了一个问题,就是虽然程序在编译时不出错误,也能运行,但是运行的结果却不正确,从文件读出的数据都是一些乱码,在这里我附上程序的代码,希望各位高人给予解答,十分感谢!!!!!  
#include   <iostream>  
#include   <string>  
#include   <iomanip>  
#include   <fstream>  
using   namespace   std;  

class   Data   //定义数据基类  
{  
public:  
Data(){};  
virtual   int   Compare(Data   *)=0;  
virtual   void   Show()=0;  
virtual   ~Data(){};  
};  

class   Node   //定义节点基类  
{  
private:  
Data   *   sdata;  
Node   *   snext;  
public:  
Node(){sdata=NULL;snext=NULL;}  
Node(Node   &node)  
{  
sdata=node.sdata;  
snext=node.snext;  
}  
void   InputData(Data   *sdata1)   {sdata=sdata1;}  
void   ShowNode()   {sdata-> Show();}  
Data   *GetData()   {return   sdata;}  
friend   class   List;  
friend   void   StoreFile(List   &);  
};  

class   List   //定义链表基类  
{  
Node   *head;  
public:  
List();  
~List(){DeleteList();}  
void   AddNode(Node   *snode);  
Node   *DeleteNode(Node   *);  
Node   *LookUp(Data   &);  
void   ShowList();  
void   DeleteList();  
Node   *GetListHead(){return   head;}  
Node   *GetNextNode(Node   *snode)   {return   snode-> snext;}  
};  

List::List()  
{  
Node   *p;  
p=new   Node;  
p-> snext=p;  
head=p;  
}  

void   List::AddNode(Node   *snode)  
{  
Node   *q,*temp;  
Data   *p=snode-> sdata;  
q=head-> snext;  
temp=head;  
while((q!=head)&&(p-> Compare(q-> sdata))==(1))  
{  
temp=q;  
q=q-> snext;  
}  
snode-> snext=q;  
temp-> snext=snode;  
}  

Node   *List::DeleteNode(Node   *   snode)  
{  
Node   *p1,*p2;  
p1=head-> snext;  
p2=head;  
while(p1!=snode)  
{  
p2=p1;  
p1=p1-> snext;  
}  
p2-> snext=p1-> snext;  
return   snode;  
}  

Node   *   List::LookUp(Data   &   data)  
{  
Node   *p=head-> snext;  
Data   *q=&   data;  
while(p!=head)  
{  
if(p-> sdata-> Compare(q)==0)  
return   p;  
p=p-> snext;  
}  
return   0;  
}  

void   List::ShowList()  
{  
Node   *p=head;  
while(p-> snext!=head)  
{  
p=p-> snext;  
(p-> sdata)-> Show();  
}  
}  

void   List::DeleteList()  
{  
Node   *p1,*p2;  
p1=head-> snext;  
while(p1!=head)  
{  
delete   p1-> sdata;  
p2=p1;