在磁盘上/从磁盘存储/加载C++对象
Storing/Loading C++ objects on/from disk
class MyClass
{
private:
AnotherClass obj;
float d;
int k;
public:
MyClass(float d = 0.3, int k = 10);
virtual ~MyClass();
// other methods goes here
}
是否有可能有一个方法允许这个类(MyClass)保存到磁盘(硬盘驱动器)void storeOnDisk(string path){...}
上的属性值,以及另一个允许从磁盘void loadFromDisk(string path)
加载属性值的方法?
如果可能的话,我是否也应该在 MyClass 的构造函数中调用 loadFromDisk(path)
(也许创建另一个构造函数),并在 MyClass 的析构函数中调用storeOnDisk(path)
,以便在退出实例化 MyClass 的程序时可以保存所有当前值?
这取决于你到底想实现什么。但是,通常,您不希望在 ctor/dtor 中包含这样的东西,因为C++有时会出现"副本"和"临时对象"。Ctors/dtors 在创建/删除时被调用,就像常规对象一样,除非您很好地准备代码,否则它也会接触文件。
通常,保留一个单独的类来处理读/写会更容易一些。想象一下,一个MyClassStorage class
将是MyClass
的friend
,并且仅包含两种方法:MyClass read(path)
和write(path MyClass&)
。
如果你喜欢把它放在单个类中,或者你不想手动完成所有事情,你可以看看一些序列化框架,如 Boost::Serialization。关于如何处理它,有许多简短而简单的例子,但是 - 仍然 - 你必须先阅读一些关于它的信息。
编辑:
请参阅 http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html 和"一个非常简单的案例"部分。它展示了如何读/写gps_position
类。请注意,此类 iteself 非常简单,除了它包含一个附加的 serialize
函数。此函数作为读取器和写入器"自动"工作。由于通常你想读取与你想要写入的字段相同的字段,所以没有必要说两次(而不是说read-A-B-C,WRITE-A-B-C,而是说:handleThemForMe-A-B-C)。
然后,在main
您有使用示例。text_oarchive
和text_iarchive
充当输出和输入文件。创建某个对象并命名为g
gps_position
,然后保存到名为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
}
它是,你可以使用 http://www.boost.org/doc/libs/1_34_0/libs/serialization/doc/index.html。(它正在做更多你期望的事情)
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 矢量和其他容器如何在磁盘上工作?
- 如何从整个磁盘中排除要装载的一个文件
- 如何将 IPropertyBag 保存到磁盘
- 防止临时对象文件访问 MSVC 中的磁盘
- 即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会保留在磁盘上
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 在 Visual Studio 中调试时,是否可以将一些 C/C++ 结构内容保存到磁盘?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 使用C++项目将数据保存在磁盘上
- 将数据复制到磁盘上新位置的语法
- 通过C++与fst将对象写入R中的磁盘
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档
- 磁盘已满时,Boost日志崩溃
- 使用大磁盘文件的 C++ 循环缓冲区
- 如何将 numpy 二维数组作为一种可以用C++读取的二进制格式存储在磁盘上
- 在磁盘上使用循环缓冲区
- 在数据写入磁盘之前,fwrite 会阻塞吗?