这取决于您想要实现的目标。但是,通常,您不希望在 ctor/dtor 中有这样的东西,因为在 C++ 中有时会出现“副本”和“临时对象”。在创建/删除时调用ctors/dtors,就像常规对象一样,除非您准备好代码,否则它也会触及文件。
通常,保留一个单独的类来处理读/写会更容易一些。想象 aMyClassStorage class
将是 afriend
的a ,MyClass
它只包含两个方法:MyClass read(path)
和write(path MyClass&)
。
如果您喜欢在单个类中使用它,或者您不想手动完成所有操作,您可以查看一些序列化框架,例如 Boost::Serialization。关于如何处理它有许多简短而简单的例子,但是 - 仍然 - 你必须先阅读一些关于它的内容。
编辑:
请参阅http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html和“一个非常简单的案例”部分。它展示了如何读/写一个gps_position
类。请注意,这个类本身非常简单,只是它包含一个附加serialize
功能。此功能“自动”作为读取器和写入器工作。由于通常您想要读取与您想要写入的字段相同的字段,因此不需要说两次(而不是说 read-ABC 和 write-ABC 你说:handleThemForMe-ABC)。
然后,在main
您有使用示例。和充当输出和输入文件text_oarchive
。text_iarchive
一些gps_position
对象被创建并命名g
,然后保存到一个名为的文件filename
中,然后从文件中读回newg
.
实际上,这ofstream
条线有点太早了,可能会产生误导。它仅用于创建 oarchive,可以像 ifstream/iarchive 一样安全地向下移动。它可能看起来像这样:
// create class instance
const gps_position g(35, 59, 24.567f);
/// ....
// save data to archive
{
// create and open a character archive for output
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << g;
// archive and stream closed when destructors are called
}
/// ....
// ... some time later restore the class instance to its orginal state
gps_position newg;
{
// create and open an archive for input
std::ifstream ifs("filename");
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> newg;
// archive and stream closed when destructors are called
}