读取 QDataStream 中的特定对象并计算存储的对象数

Posted

技术标签:

【中文标题】读取 QDataStream 中的特定对象并计算存储的对象数【英文标题】:Reading specific object in QDataStream and count number of objects stored 【发布时间】:2020-02-11 04:38:37 【问题描述】:

我正在将一些对象写入二进制文件,我想读回它们。 为了向您解释我要做什么,我准备了一个简单的示例,其中包含一个包含儿童的 QString 名称和 QList 名称的类 User。请看下面的代码。

#include "QString"
#include "QFile"
#include "QDataStream"
#include "qdebug.h"

class User

protected:
QString name;
QList<QString> childrens;

public:
QString getName() return name;
QList<QString> getChildrens() return childrens;

void setName(QString x) name = x;
void setChildrens(QList<QString> x) childrens = x;

//I have no idea of how to get the number of users in "test.db"
int countDatabase()




//I would like to read the user named "pn" without putting all users in memory
void read(QString pn)

    QFile fileRead("test.db");
    if (!fileRead.open(QIODevice::ReadOnly)) 
        qDebug() << "Cannot open file for writing: test.db";
        return;
    
    QDataStream in(&fileRead);
    in.setVersion(QDataStream::Qt_5_14);
    in>>*this;



void write()

    QFile file("test.db");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) 
        qDebug() << "Cannot open file for writing: test.db";
        return;
    
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_5_14);
    out<<*this;


friend QDataStream &operator<<(QDataStream &out, const User &t)

    out << t.name << t.childrens;
    return out;


friend QDataStream &operator>>(QDataStream &in, User &t)

    QString inname;
    QList<QString> inchildrens;
    in >> inname >> inchildrens;
    t.name = inname;
    t.childrens = inchildrens;
    return in;


;


////////////////////////////////////////////////////////////////
int main()

    User u;
    u.setName("Georges");
    u.setChildrens(QList<QString>()<<"Jeanne"<<"Jean");
    u.write();

    User v;
    u.setName("Alex");
    u.setChildrens(QList<QString>()<<"Matthew");
    u.write();

    User w;
    w.setName("Mario"); // no children
    w.write();

    User to_read;
    to_read.read("Alex");

    qDebug()<<to_read.getName();
    return 0;

我成功地在我的二进制文件中写入了我想要的所有用户。但是,我希望能够在不将所有内容加载到内存中的情况下:

要知道二进制文件中存储了多少用户, 通过给出用户名来读取用户。

到目前为止,我一直在使用 QDataStream,并且正在重载 > 运算符以进行序列化。也许我想要的这种方法是不可能的。您能否为我提供一些提示以使 QDataStream 或其他一些方法取得成功?

【问题讨论】:

如果您不想将所有内容加载到内存中,我认为您需要在保存记录数的文件开头设置一个标题,然后您还需要一个索引文件或使用文件的一部分作为 n 索引。但是他的方式让你越来越接近数据库,所以你为什么不直接使用 sqlite 呢? 我不想使用 sqlite,因为我不希望在程序之外访问或修改数据。 同时,我不知道如何在sqlite数据库中存储一个QList。 【参考方案1】:

请在此处找到最终不需要二进制文件但在 SQL db 中使用 BLOB 的解决方案:

SOLUTION

【讨论】:

以上是关于读取 QDataStream 中的特定对象并计算存储的对象数的主要内容,如果未能解决你的问题,请参考以下文章

从 QDataStream 读取 QDateTime 给出 null

QDataStream 读取和写入的字节数比 QFile::length() 报告的要多

调整 QDataStream

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

带 QDataStream 的 TGA 读取标头

QT中关于Qdatastream使用问题 socket 读数据同时写入file内