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

Posted

技术标签:

【中文标题】尝试从文件中读取矢量时出错【英文标题】:error when trying to Read vector from file 【发布时间】:2015-12-20 11:11:39 【问题描述】:

我是 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&lt; char *&gt;(&amp;stud)但这并没有解决问题。但是当我只是将向量写入文件而不尝试读取它时,代码可以成功运行而没有任何错误。

当我尝试读取向量时,有人知道是什么导致了我的代码中的错误吗?以及我遇到的那种错误。 我可以在没有任何错误的情况下从文件中写入和读取向量的正确方法是什么。

【问题讨论】:

【参考方案1】:

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

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

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

整数 (*) 表示长度 向量中每个元素的序列化形式(n 项)

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

(*) 在这个简单的示例中,我假设您将在您编写文件的相同架构中读取文件。如果您希望序列化形式可跨不同架构移植,则需要注意整数大小(4 字节或 ...)和字节序。但恕我直言,这将是另一个问题。

【讨论】:

我是一个初学者,所以我不太了解序列化。您能否为我提供一段 sn-p 代码,以了解如何使用它来帮助我成功读取向量?谢谢【参考方案2】:

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

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

一般来说,您需要序列化来完成这项工作。如果你详细地给你的课更多的帮助是可能的。但我建议首先为int 之类的简单类型执行此工作,然后根据您的情况对其进行扩展。

【讨论】:

以上是关于尝试从文件中读取矢量时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试运行在 C++ 中读取的文件时出错

从视图中的表单读取文件输入时总是出错

尝试从要显示在 ListView 中的字符串列表中读取项目时出错

E0312, C2664 尝试将矢量对象作为函数参数传递时出错

调整对象矢量大小时出错

在 C++ 中读取顺序文件时出错