使用指向文件的指针保存矢量中的对象
Save objects from vector with pointers to file
我有一个向量,它带有指向基类对象的指针,这样我就可以管理从该类派生的对象。
vector <Product*> products;
我正在尝试在迭代向量的同时将这些对象写入文件但我不确定这是否正确。
void Inventory :: saveProductsToFile()
{
ofstream outfile;
outfile.open("inventory.dat",ios::binary);
list <Product*> :: iterator it;
for(it=products.begin(); it!=products.end(); it++)
outfile.write((char*)*(it),sizeof(Product));
}
文件已经创建,但我不知道我是在保存实际对象本身还是它们地址。这是正确的还是有其他方法?
文件如下所示:
ˆFG " H*c Âõ(œ@@pFG h*c b'v b@
您的代码可以工作。不能在中序列化多态对象那样。对于初学者来说,您正在编写隐藏的vptr
到磁盘;当您重新读取数据时,它将无效。和您只写出基类(Product
)中的数据,因为这就是sizeof(Product)
的评估结果最后,只写一个char[]
以外的任何东西的字节映像可能意味着你将无法重新读取数据将来的某个时间(在编译器升级或机器之后升级或其它)。
您要做的是为文件,然后写。对于基本类型,您可以启动有一些现有的东西,比如XDR或协议缓冲区,但是这两种方法都不能很好地处理多态类型。对于多态类型,您必须首先定义重读时要确定有问题的类型。这可以是棘手:std::type_info
中没有任何帮助,所以您需要一些方法在(派生的)类型和标识符。然后每个派生类必须实现首先写入其类型的CCD_,然后一个接一个地写出它的数据。阅读时读取类型,查找相应的读取函数键入一个映射,并调用该函数,然后该函数读取数据一个接一个。
最后,我可以指出,所有成功的序列化我看到的方案依赖于生成的代码。你描述了你在单独的文件中,或在特殊标记中(在C++中标记的注释)并且具有读取该注释的程序,并生成必要的代码(通常是实际的类您使用)。
这不是"序列化"数据的方式。像这样,指针只有在运行时或删除它们之前(取决于首先发生/停止的情况)才有效。像这样,你将无法恢复你的数据,因为在程序停止后,你以前记忆中的一切都将无效。您必须存储类中的实际值。
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- C++17 如何保存泛型可调用对象以供以后使用
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 将对象信息保存到二进制文件中
- C++两次从文件保存对象读取多重继承
- 有没有办法自动初始化 std::shared_ptr 来保存有效对象?
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 将抽象值对象保存在包装器中和继承的用法中
- 如何保存模板的对象阵列进行文件
- 我的共享内存对象保存在哪里
- 保存对象的攻击函数并稍后称呼它是明确定义的行为
- 如何创建一个动态数组,该数组可以保存从C++中派生的同一基类的所有不同对象
- 即使在 C++ 中的 fstream.clear() 之后,对象也没有被保存
- 如何将所有派生类对象保存在一个容器中
- Visual C++,CMap对象保存到blob列
- 将派生类的对象保存在基 c 的 std::list 中
- 使用 libpng - const 对象保存图像
- 在将图像对象保存到文件 (GDI+) 时获取 Win32Error
- 如何使用weak_ptr构造一个对象,该对象保存对父项的引用
- 将对象保存到二进制文件中的有效方法