尝试从文件中读取向量时出错

时间:2015-12-20 11:11:39

标签: c++ file vector casting

我是c ++的初学者,我编写了这段代码来测试我是否可以将矢量写入二进制文件,然后从文件中读取矢量。  这是代码:

vector <student> stud;
vector <student> temp;

void makeObj (string name, int age)
{
student newstudent (nam, ag);
stud.push_back(newstudent);
}

int main ()
{
makeObj("kwame", 14);
stud[0].print();

makeObj("kojo", 12);
stud[1].print();

makeObj("kwabena", 7);
stud[2].print();

fstream gameSave ("gameSaveFile.txt", ios::binary | ios::out | ios::in);
gameSave.write(  (char *) &stud, sizeof(stud));
gameSave.seekg(0);

gameSave.read( (char *) &temp, sizeof(stud));

temp[0].print();

gameSave.close();
return 0;
}

当我运行代码时,程序运行时会发生未知错误,我无法弄清楚是什么错误。起初我认为这可能是一个错误的铸造。所以我决定使用reinterpret_cast来渲染矢量,如:reinterpret_cast< char *>(&stud),但这并没有解决问题。但是当我只是将矢量写入文件而不尝试读取它时,代码运行成功而没有任何错误。

当我尝试读取矢量时,有人知道我的代码中的错误是什么吗?以及我得到的那种错误。 什么是我可以正确地从文件中写入和读取向量的正确方法。

2 个答案:

答案 0 :(得分:0)

二进制文件,如果只是一个字节序列。另一方面,学生的向量是一个内部使用指针的复杂对象:向量具有指向其内部数组的开头的指针,并且当学生似乎具有字符串属性时,每个学生对象将具有指向内部的指针字符数组。

你不能指望只写矢量的顶层部分就足够了。您需要的是序列化,这意味着复杂对象和字节序列之间的转换(双向)。

矢量通常通过以下方式序列化(二进制形式):

  • 长度为
  • 的整数(*)
  • 向量的每个元素的序列化形式(n个项目)

在不知道student类的确切定义的情况下,我不能说它的序列化形式是什么。

(*)在这个简单的例子中,我假设你将在你编写它的同一架构中读取文件。您希望序列化的表单可以跨不同的体系结构移植,您需要处理整数大小(4个字节或...)和字节序。但恕我直言,这将是另一个问题。

答案 1 :(得分:0)

sizeof(stud)只显示向量在堆栈中占用的大小,仅此而已。此外,向量的指针与其内部数据的指针不同。您必须使用像stud.data()这样的代码来缓存内部数据的指针。而且我认为没有办法将向量的内部指针设置为另一个向量,所以当然你无法获得一个向量的数据指针并将其分配给另一个向量。我想你可以使用这样的代码在你的vector中写入数据(如果student类中没有任何指针:

gameSave.write((char*)stud.data(), stud.size() * sizeof(student)); // It just write your data not member variables of vecto

您需要序列化来完成这项工作。如果您详细了解您的课程,可以提供更多帮助。但我建议首先为int之类的简单类型执行此工作,然后根据您的情况扩展它。