【问题标题】:Store and Load objects from a file从文件中存储和加载对象
【发布时间】:2015-11-19 11:13:36
【问题描述】:

我正在为类制作这个程序,我们应该将类中的对象存储在文件中,然后加载它们。但我总是存储最后一个对象而不是第一个。尝试了 seekp 功能,但它不起作用。对象的大小也不应该是 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;

}

【问题讨论】:

  • 我猜你每次调用fout.open都会覆盖文件

标签: c++ file class


【解决方案1】:

您的fout.open() 每次都会重写文件。如果你想追加到文件中,也就是说,在所有其他学生已经写完之后,让每个store()调用写student,那么你可以使用ios::app标志。

或者,最好不要打开store() 中的文件。让您的 store() 实际上接受流作为参数;然后在主程序中打开文件(每个学生一次)并将流传递给store()。这不仅可以解决您的问题,还可以使您的 student 类更具可配置性,因为它可以轻松写入任何文件,或者通常写入student 用户需要的任何流。

顺便说一句,还要确保以这种方式写您的students 是正确。例如,如果您的 student 中有任何指针(例如,包括 std::string 成员,因为它们内部有指针),您将不会得到您期望的结果。

至于对象大小,没有看到student类的整个声明是不可能回答的。

【讨论】:

  • 4 个整数和 30 个字符。听取您的建议,似乎无法将流作为参数传递。
  • @Yolo,“4 个整数和 30 个字符”听起来更像是 46 个字节,因为 int 在现代系统上很可能是 4 个字节。但是您最好将此作为一个单独的问题提出,并包括整个student 类定义。因为不经过溪流,这很奇怪。只需确保通过引用传递它:student::store(int z, fstream&amp; fout)
猜你喜欢
  • 2011-02-14
  • 2021-02-04
  • 2011-01-24
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多