如何将矢量保存到二进制文件中

How can I save a vector to a binary file?

本文关键字:二进制文件 保存      更新时间:2023-10-16

这就是我所拥有的:

#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)字节应该足够好。这仅适用于普通旧数据的类型。