【发布时间】:2020-03-16 18:08:46
【问题描述】:
我正在学习 c++ 中的 fstream,我喜欢用二进制编写一个类,然后检索它。当然,这一切都大错特错了。
这是类
class Student
{
private:
const char* name;
int age;
public:
Student()
{
};
Student(const char* name, int age) : name{ name }, age{ age }{};
void display()
{
std::cout << "name : " << this->name << std::endl << "age : " << this->age << std::endl;
}
};
写作课(我认为有效)
void writeDatabase()
{
Student jack("jack", 21);
std::ofstream file;
file.open("data.dat", std::ios::binary);
if (file.is_open())
{
file.write(reinterpret_cast<char*>(&jack), sizeof(jack));
std::cout << "wrote to file";
}
else
{
std::cout << "error opening file when writing to database\n";
}
file.close();
}
我被困在哪里
void readData()
{
Student st;
std::ifstream file;
file.open("data.dat", std::ios::binary);
if (file.is_open())
{
std::cout << "opened file\n";
file.read(reinterpret_cast<char*>(&st), sizeof(st));
st.display();
file.close();
}
else
{
std::cout << "error opening file when reading\n";
}
}
【问题讨论】:
-
提前谢谢,错误是读取访问冲突:)
-
阅读序列化和反序列化。您不能仅将任何类原始字节逐字节写入文件并将其读回。特别是如果它包含指针或引用成员或复杂类,如
std::list等。 -
写作类(我认为有效) -- 不,它没有。您正在将指针值写入文件。如果你打开文件,你会发现“jack”这个词已经找不到了,而是垃圾。
-
age没问题,因为它是 POD(普通旧数据)。任何复杂变量,包括指针另一端的动态变量,都不是结构的一部分,因此不会被保存。 -
@Dems314 您需要编写类所代表的数据,而不是对象的原始字节。 “名称”表示字符,因此您以某种方式写入字符数据,以便在读入时可以重新创建对象。如果您有一个代表棋盘的
char **,您是否认为写入双指针可以保存状态国际象棋游戏到文件?当然不是——你需要的还不止这些。这就是序列化和反序列化的要点。