如何将矢量保存到二进制文件中
How can I save a vector to a binary file?
这就是我所拥有的:
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;
void saveVector(vector<ObjectName*>);
vector<ObjectName*> readVector();
int main(){
vector<ObjectName*> objects;
int option;
cin >> option;
switch(option){
case 1:{
//read vector
for(int i =0; i < readVector().size(); i++){
objects.push_back(readVector()[i]);
}
break;
}
case 2:{
//save vector
objects.push_back(new ObjectName());
saveVector();
break;
}
return 0;
}
void saveVector(vector<ObjectName*> objects){
ofstream fout("./Binary/ObjectsData.bin", ios::out | ios::binary);
int size1 = objects.size();
fout.write((char*)&size1, sizeof(size1));
fout.write((char*)objects.data(), size1 * sizeof(int));
fout.flush();
fout.close();
}
vector<ObjectName*> readVector(){
vector<ObjectName*> list2;
ifstream is("./Binary/ObjectsData.bin", ios::binary);
int size2;
is.read((char*)&size2, 4);
list2.resize(size2);
is.read((char*)&list2[0], size2 * sizeof(list2));
is.close();
return list2;
}
objectName只是任何类型的对象的名称。
我在做什么错?如果我获取"对象"向量大小并将其与" readVector()"向量大小进行比较(执行程序并首次保存向量),则表明它们具有相同的大小,但是如果我尝试添加我得到的"对象"向量的另一个对象"分割故障(核心倾倒)"。有没有更好的方法来保存和读取对象并将它们添加回向量?
我恐怕您在这里有一个问题的 lot ,最终您只需要回到一个良好的C 教程,只是学习语言。您在此处都领先于当前对语言的理解。
但是,一个很大的是,您要将指针保存到对象,而不是对象本身。您无法将指针从程序的先前执行中保存,然后在随后的程序中使用它们。指针只有在分配其指向的内存以及明确 delete
或程序结束时有效。
您需要做的是单独保存每个对象;指向对象,而不是指针本身&mdash;然后一次,一次创建对象,从文件中读取它们,然后将指针添加到他们到向量。
或者,您可以将对象直接存储在向量中,而不仅仅是指向它们。
,但是,无论哪种方式,如果您的对象不是普通的旧数据,则这些都不可用,因为否则它们将在其中有类似的vtables,您无法保存。在这种情况下,您需要一种更复杂的序列化方法,而不仅仅是将内存倒入磁盘并重新读取。
首先,编写一个序列化单个对象的函数。这可能是std::ostream
的<<
操作员。然后,编写一个for
循环或std::for_each
调用,该循环在向量上迭代并序列化每个对象。将对象本身存储在矢量中,而不是指针(或者您想存储指针或智能指针,可以将它们放在for
循环中)。
简单的示例不是对您的问题的完整答案:
#include <cstdlib>
#include <iostream>
#include <vector>
using std::cout;
int main(void)
{
std::vector<int> v = {1,2,3};
for ( const int &i : v )
cout << i << std::endl;
return EXIT_SUCCESS;
}
您可以使用std::ostream::write()
编写二进制数据而不是字符串数据。如果您实际上关心跨平台兼容性,则首先将其转换为指定布局和endianness的标准格式,但您可能不这样做,因此在地址reinterpret_cast<const char*>(&x)
上编写sizeof(x)
字节应该足够好。这仅适用于普通旧数据的类型。
- 在C++中将类(带有Vector成员)保存为二进制文件
- 保存/加载大量短数组到二进制文件
- 将内部带有矢量的结构保存/读取到二进制文件中
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何在Qt中使用QDataStream将自定义结构保存/加载到二进制文件中?
- 将对象信息保存到二进制文件中
- 从二进制文件中保存的 4 字节双精度读取 8 字节双精度
- 将数组保存到二进制文件不起作用 c++
- 保存和加载类数据存储在C 中的二进制文件中
- 使用流运算符将具有整数值的类保存到二进制文件中 >> /<<
- 如何将矢量保存到二进制文件中
- C :如何从二进制文件中读取特定数量的字节并将其保存到UINT16_T
- 将结构保存在二进制文件中,仅在C 中读取值
- 如何从二进制文件中读取双精度并将其保存在向量中
- 将简短的int保存在二进制文件中而不是文本文件中
- C++:如何保存独立于平台的二进制文件
- 以二进制形式保存文本文件
- 保存并加载二进制文件中的提升::时间::steady_clock::time_point
- 将二进制文件内容保存在字符串中,以便能够对其进行 md5 并在以后与其他文件进行比较
- 如何将字符串保存为二进制文件