如何在 C++ 中从二进制文件写入和读取 class
How to write and read class from binary file in c++
我正在学习 C++ 中的 fstream,我喜欢用二进制编写 class,然后检索它。当然,一切都大错特错了。
继承人 class
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;
}
};
写作class(我认为可行)
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";
}
}
这里的问题不是您错误地从磁盘读取或写入字节。相反,您 运行 遇到的问题是这些字节并不代表您想要的意思。
您的 class 有一个数据成员 name
,它是 const char *
。这是指向内存中包含名称的某个位置的指针。当您使用 write
函数将数据从您的类型写入磁盘时,它会将指针存储在磁盘上的某个位置。当您随后从磁盘加载数据时,它正在重新加载该指针。
问题是指针不是您要存储的内容。如果您从磁盘重新加载指针,它会指向内存中它曾经指向的相同位置,但是没有理由怀疑您会在内存中它指向的位置找到学生的名字。如果您关闭了程序然后重新打开它,您应该看不到之前 运行.
的任何内存
要解决此问题,您需要更改将数据写入磁盘的方式。不要从 class 复制原始字节,而是看看你是否能找到一种方法以某种方式写出姓名和年龄,然后你可以读回该数据。例如,也许你会将它作为年龄写入磁盘,然后是 space,然后是名字。
希望对您有所帮助!
我正在学习 C++ 中的 fstream,我喜欢用二进制编写 class,然后检索它。当然,一切都大错特错了。
继承人 class
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;
}
};
写作class(我认为可行)
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";
}
}
这里的问题不是您错误地从磁盘读取或写入字节。相反,您 运行 遇到的问题是这些字节并不代表您想要的意思。
您的 class 有一个数据成员 name
,它是 const char *
。这是指向内存中包含名称的某个位置的指针。当您使用 write
函数将数据从您的类型写入磁盘时,它会将指针存储在磁盘上的某个位置。当您随后从磁盘加载数据时,它正在重新加载该指针。
问题是指针不是您要存储的内容。如果您从磁盘重新加载指针,它会指向内存中它曾经指向的相同位置,但是没有理由怀疑您会在内存中它指向的位置找到学生的名字。如果您关闭了程序然后重新打开它,您应该看不到之前 运行.
的任何内存要解决此问题,您需要更改将数据写入磁盘的方式。不要从 class 复制原始字节,而是看看你是否能找到一种方法以某种方式写出姓名和年龄,然后你可以读回该数据。例如,也许你会将它作为年龄写入磁盘,然后是 space,然后是名字。
希望对您有所帮助!