qt以二进制流的方式存储数据,稳定高效,解决QDataStream多余存储数据长度问题

一、前言

为什么使用二进制流呢,因为比较通用,不管是任何系统,不限制于任何系统,都能读写二进制数据文件,此方式也是对于大数据较快的一种,就比如之前用过刷新图片,图片格式为jpg,png等,是有算法解码才能解读的, 而二进制流数据文件不需要任何解码,只要定义好存储的协议,就可以使用,今天写这个帖子也主要是记录一下,顺便解决了在存储二进制流数据时,使用QDataStream时 遇到的自动累加数据长度问题。

二、环境

window10

mingw

qt5.12

三、正文

存储文本类数据可参见其他帖子,有介绍,这里也不过多说明,直接步入正题,核心代码:

    QDataStream out(&file);
    char data[10];
    memset(data,0,10*sizeof(char));
    char* p = "this is";
    strcpy(data,p);
    out.writeRawData(data,10);
    file.close();

上面代码仅做参考,与下文图不配套。

以上方式就是存储数据以数据流的方式,以上我的file路径为,是一个db文件,可以看见使用的类是QDataStream而不是QTextStream,QTextStream是存储文本类专用的类,这里使用的是writeRawData函数,常用的还有”<<"这个方式,但是使用”<<"方式会导致数据前面多出4个字节代表数据包长度,这个是因为其底层代码就这么写的,所以没有办法只能用writeRawData函数。在填入的第一个参数是字符数组,第二个参数是数量,这里的数量不可小于8,否则是无法用ue查看出来的,这个是亲自试验过。

1.使用writeRawData测试代码:

char groupmove30[6]={
31,30,29,28,27,26
};
QDataStream stream(&file);
stream.writeRawData(groupmove30,8);
file.close();//关闭文件

使用writeRawData正常存储后使用ue读取查看数据如下图:

可以看出存储的数据是正确的,超出了数组范围的数据是自动补零的。

 

2.使用”<<"测试代码:

char groupmove30[6]={
31,30,29,28,27,26
};
QDataStream stream(&file);
stream<<groupmove30;
file.close();//关闭文件

使用"<<"正常存储后使用ue读取查看数据如下图:

可以看出存储的数据多了4个字节长度,在每包前面。

在使用文件存储之间首先判断文件是否存在,不存在就创建一个,方式如下:

    QDir *folder = new QDir;
    bool exist = folder->exists(qApp->applicationDirPath()+"/history");//history文件夹是否存在
    if(!exist)folder->mkdir(qApp->applicationDirPath()+"/history");//不存在创建文件夹
    QFile file(qApp->applicationDirPath()+"/history/"+QDateTime::currentDateTime().toString("yyyyMMdd")+".db");//文件路径名称
    bool exist1=file.exists();//标志位记录文件是否新建
    file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append);//打开文件,若不存在则新建,若存在则继续后面写入

四、结语

以上就是以二进制流存储数据,避免多余字节问题的替换解决办法。和整体方式的介绍啦。

Guess you like

Origin blog.csdn.net/qq_37603131/article/details/118308770