我正在为类创建这个程序,我们应该将一个类中的对象存储在一个文件中,然后加载它们。但我总是得到最后一个对象而不是第一个。尝试了搜索功能,但它不起作用。另外一个对象的大小也不应该是38个字节,而不是48个我得到的?
void student::load()
{
fstream fin;
fin.open("StudentData.bin",ios::binary|ios::in);
fin.read((char*)this,sizeof(*this));
}
void student::store(int z)
{
fstream fout;
fout.open("StudentData.bin",ios::binary|ios::out);
//fout.seekp(38*z, fout.beg)
cout<<sizeof(*this);
fout.write((char*)this,sizeof(*this));
}
for(i=0;i<count;i++)
{
s[i].store(i);
}
cout<<"Done!";
student pleb;
pleb.load();
pleb.showstudent();
return 0;
}
答案 0 :(得分:0)
您的fout.open()
每次都会重写该文件。如果你想追加到文件,也就是说,要让每个store()
调用在所有其他已经写好的学生之后写student
,那么你可以使用{{1国旗。
或者,更好的是,根本不要在ios::app
中打开文件。让您的store()
执行接受流作为参数;然后在主程序中打开文件(每个学生一次)并将流传递给store()
。这不仅可以解决您的问题,还可以使您的store()
类更易于配置,因为它可以很容易地写入任何文件,或者通常可以写入student
用户所需的任何流。
BTW,还要确保正确以这种方式编写student
。例如,如果您的student
中有任何指针(包括,例如,student
成员,因为他们有内部指针),您将无法获得预期的结果。
至于对象大小,回答没有看到std::string
类的整个声明是不可能的。