我是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)
,但这并没有解决问题。但是当我只是将矢量写入文件而不尝试读取它时,代码运行成功而没有任何错误。
当我尝试读取矢量时,有人知道我的代码中的错误是什么吗?以及我得到的那种错误。 什么是我可以正确地从文件中写入和读取向量的正确方法。
答案 0 :(得分:0)
二进制文件,如果只是一个字节序列。另一方面,学生的向量是一个内部使用指针的复杂对象:向量具有指向其内部数组的开头的指针,并且当学生似乎具有字符串属性时,每个学生对象将具有指向内部的指针字符数组。
你不能指望只写矢量的顶层部分就足够了。您需要的是序列化,这意味着复杂对象和字节序列之间的转换(双向)。
矢量通常通过以下方式序列化(二进制形式):
在不知道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
之类的简单类型执行此工作,然后根据您的情况扩展它。