以二进制格式读取类

Read class in binary format

本文关键字:读取 格式 二进制      更新时间:2023-10-16

我正在尝试以二进制格式读取我的类,如下所示:

FILE* file = fopen(filePath.toStdString().c_str(), "rb");
if (file == NULL)
{
QMessageBox::critical(this, "Ошибка!", "Ошибка при открытии файла!");
return;
}
while (!feof(file))
{
Dog* dog;
fread(dog, sizeof(Dog), 1, file);
_list->emplace_back(dog);
}
fclose(file);

但是我得到一个错误:程序崩溃了。该文件存在,数据按如下方式写入:

FILE* file = fopen(filePath.toStdString().c_str(), "wb");
if (file == NULL)
{
QMessageBox::critical(this, "Ошибка!", "Ошибка при открытии файла!");
return;
}
for (int i = 0; i < _list->size(); i++)
{
fwrite(_list->get(i), sizeof(Dog), 1, file);
}
fclose(file);

此代码运行时没有错误。请帮忙:(

实际上问题是Dog类包含一个字段QString,没有程序知道要读取多少字节(字符串"asd""asdasdasdasdasdasdsad"返回不同的syzeof)。因此错误。实际上,执行以下操作是正确的:

FILE* file = fopen(filePath.toStdString().c_str(), "rb");
while (!feof(file))
{
int nameSize;
QString name;
int breedSize;
QString breed;
int weigth;
QDate birthDate;
fread(&nameSize, sizeof(int), 1, file);
for (int i = 0; i < nameSize; i++)
{
QChar ch;
fread(&ch, sizeof(QChar), 1, file);
name += ch;
}
fread(&breedSize, sizeof(int), 1, file);
for (int i = 0; i < breedSize; i++)
{
QChar ch;
fread(&ch, sizeof(QChar), 1, file);
breed += ch;
}
fread(&weigth, sizeof(int), 1, file);
fread(&birthDate, sizeof(QDate), 1, file);
_list->emplace_back(new Dog(name, breed, weigth, birthDate));
}
fclose(file);

尝试以下更正:

std::ifstream data_file("my_dogs.dat", ios::binary);
Dog d;
std::vector<Dog> database;
while (data_file.read((char *) &d, sizeof(Dog)))
{
database.push_back(d);
}

在上面的片段中,我正在使用C++流打开文件。混合C++和 C 样式流是一个坏主意。

循环基于从流读取的成功。 如果读取失败,循环将终止。

数据被读入局部变量,然后追加到数据库中。 无需分配内存,因为std::vector会将副本追加到容器。

您可以用std::list替换std::vector,但使用适当的方法追加到列表中。

在互联网上搜索"C++序列化"和"C++ QT 序列化"以获取更多信息。