以二进制格式读取类
Read class in binary format
我正在尝试以二进制格式读取我的类,如下所示:
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 序列化"以获取更多信息。
相关文章:
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 如何将 numpy 二维数组作为一种可以用C++读取的二进制格式存储在磁盘上
- 以二进制格式读取类
- C :如何从格式的文本文件中读取许多数据到程序中
- 如何以"hh:mm:ss"格式读取C ++中的HH,MM和SS
- 我如何使用错别字读取格式的数据
- 如何从文件中读取并将内容存储在动态 2D 数组中并以网格格式显示
- 提升信息解析器在读取/写入 INFO 格式文件时删除所有注释
- 如何从内存中读取原始图像 (YUV 4:2:2) 格式的图像数据
- 以简单格式"c:filessample.txt"从用户读取文件路径
- 具有挑战性的数据文件格式,需要将其读取为包含类对象的数组的VAR
- 如何从字符中读取ASCII值并将其转换为十六进制格式的字符串
- 如何读取具有特定格式的行)C++
- OpenSsl无法读取DER格式的证书
- 如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
- 哪些数据文件从python(或其他)中读取的C 输出格式更有效
- 如何以指定格式读取C 中的多个TXT文件
- 读取C 和输出格式的文本文件
- 我可以做一个不形式的写入文件,然后从文件中进行整体类型的格式读取