这是我读写向量的代码; 我在执行时没有收到错误,但是每当我从它回读时; 它给出了整数的随机值,而不是50和100。 我做错了什么?
我已经在另一个对象中使用了向量对象,并且我正在尝试使用对象的二进制归档来归档它。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Rest{
int value;
public:
void setvalue(int value){this->value=value;}
int getvalue(){return value;}
};
class Admin{
vector<Rest> restaurant;
public:
Admin(){}
void setValue(int value){
Rest obj1;
Rest obj2;
obj1.setvalue(value);
obj2.setvalue(value+50);
restaurant.push_back(obj1);
restaurant.push_back(obj2);
}
vector<Rest> getRestFromFile(){
Admin obj;
fstream getsavedvector("Testsave.BIN", ios::in | ios::binary);
getsavedvector.read(reinterpret_cast<char*> (&obj), sizeof(obj));
getsavedvector.close();
return obj.getRest();
}
void setRestVectorToFile(Admin obj){
fstream savevector("Testsave.BIN", ios::out | ios::binary);
savevector.write(reinterpret_cast<char*> (&obj),sizeof(obj));
savevector.close();
}
void setRestVector(vector<Rest> restaurant){
for(int i=0;i<restaurant.size();i++){
this->restaurant.push_back(restaurant[i]);
}
}
vector<Rest> getRest(){
return this->restaurant;
}
void Display(){
for(auto v: restaurant){
cout<<v.getvalue()<<endl;
}
}
};
int main()
{
Admin obj;
obj.setValue(50);
obj.setRestVectorToFile(obj);
Admin obj2;
obj2.setRestVector(obj2.getRestFromFile());
obj2.Display();
}
基本上,您做错的是,您不能仅仅将C++对象强制转换为char*
,然后在磁盘上转储一些字节,并期望这样做能起作用。 这在一些有限的情况下是可行的,比如,当你只是写基本的对象,比如整数,或者只包含整数的结构,或者类似的东西,但是对于更复杂的东西,比如向量,它是行不通的。 正确的方法是提出或使用现有的序列化格式,以便在写入或读取文件时对向量进行适当的编码。
在这种情况下,您可以使用一个非常简单的方案,无需太多更改,即首先存储向量的长度,然后依次存储每个元素。 这很容易读和写。 如果您想要一个更通用的解决方案,您将希望了解JSON,msgpack,XML等格式,甚至SQLite或PostgreSQL等数据库管理系统。 哪个是“正确”的选择取决于您的应用程序,在这种情况下,特别是如果您只是学习文件的读写,您可以将自己的简单格式作为练习滚动。