最近在写一个小程序时,主要是文件信息的读取。
在程序中定义了类Tperson
class Tperson
{
public:
Tperson(string newName=NULL ,int newAge=0);
virtual~Tperson();
private:
string name;
int age;
public:
void SetName(string newName);
voidSetAge(int newAge);
stringGetName();
intGetAge();
};
person::Tperson(string newName,int newAge)
{
name=newName;
age=newAge;
}
Tperson::~Tperson()
{
}
int Tperson::GetAge()
{
returnage;
}
string Tperson::GetName()
{
returnname;
}
void Tperson::SetAge(int newAge)
{
age=newAge;
}
void Tperson::SetName(string newName)
{
name=newName;
}
然后定义两个类数组
Tpersonap1[3]={Tperson("wang",26),Tperson("zhao",29),Tperson("huang",21)};
Tperson ap2[3];
主程序如下
int main(int argc,char*argv[])
{
inti;
ofstreamofile;
ofile.open("data.text",ios::out);
if(!ofile)
{
cout<<"can'topen output file"<<endl;
return-1;
}
for(i=0;i<3;i++)
{
ofile.write((char*)&ap1[i],sizeof(ap1[i]));
}
ofile.close();
ifstreamifile;
ifile.open("data.text",ios::in|ios::binary);
if(!ifile)
{
cout<<"can'topen input file"<<endl;
return-1;
}
for(i=0;i<3;i++)
{
ifile.read((char*)&ap2[i],sizeof(ap2[i]));
}
ifile.close();
for(i=0;i<3;i++)
{
cout<<"nameof person "<<i+1<<" is"<<ap2[i].GetName()<<endl;
cout<<"ageof person "<<i+1<<" is"<<ap2[i].GetAge()<<endl;
}
return0;
}
编译完全通过,可是一运行就出错,内存不能读。纠结好了好久,这可是按书上面的例子编写的。
最后实在不行了,一行一行代码的查找,发现出错在Tperson ap2[3]上。因为这个类是没有初始化的,只能调用默认构造函数,可是默认构造函数中的string newName=NULL,这样表面上看是给了默认值,实际上该参数仍然是不定的。
将stringnewName=NULL改为stringnewName=””。
重新编译,运行OK.。
C++中的指针真难伺候啊