zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

QT ---QTextStream 类(文本流)和 QDataStream 类(数据流)

2023-04-18 14:27:46 时间

参考文章–https://blog.51cto.com/u_11531789/5046248
利用QDateStream读写二进制文件参考:https://blog.csdn.net/wzz953200463/article/details/114107102

QDataStream

读写原始二进制数据

可以使用int readRawData(char s, int len)将数据读入一个预先分配好的char

缓冲区 s 必须被预先分配,缓冲区 s 使用 new[]分配,使用 delete 操作符销毁

可以使用int writeRawData(const char *s, int len)函数把原始数据写入datastream

使用这种方式的话,要由你自己进行所有数据的编码和解码

​int writeRawData(const char *s, int len);​

把 len 个字节的数据从缓冲区 s 写入流,并返回实际写入的字节数,若发生错误,则返回-1,注意:数据未编码

​int readRawData(char *s, int len);​

从流中读取最多 len 个字节到缓冲区 s 中,并返回读取的字节数,若产生错误,则返回−1,缓冲区 s 必须被预先分配。数据是未编码的。

示例代码

QFile f("l.txt");

QDataStream out(&f);


f.open(QIODevice::WriteOnly);
    out<<QString("BBB");
    /*以二进制形式写入一个字符串BBB到文件l.txt中,注意:以此种方式写入的字符串BBB是已经编了码的,
      因此实际写入文件的内容并不一定是4字节的大小。*/
    char c[4]="CCC";  //创建缓冲区
    int i1=out.writeRawData(c,4); //把缓冲区c中的4个字节内容写入流中
    //注:因为此函数写入的内容未编码,因此将直接向文件写入一个字符串"ccc"(4字节大小)
    qDebug()<<i1;
    f.close();

    QDataStream in(&f);
    f.open(QIODevice::ReadOnly);
    char *pc=new char[114]; //创建一个缓冲区
    int i2=in.readRawData(pc,114); //从流中读取最多114个字节内容放到缓冲区pc中
    //此时pc中保存的值就是文件l.txt中的原始二进制数据,注意:实际未必会读取114个字节
    qDebug()<<i2; //输出实际读取的字节数
    for(int j=0;j<i2;j++){    //输出全部内容,以循环的方式逐字符输出
        qDebug()<<pc[j];
    }

    f.close();


}

​实例:读取保存自定义类对象

在这里插入图片描述

writeBytes()

QDataStream &QDataStream::writeBytes(const char *s, uint len)

先向文件写入一个quint32的数据,该值就是将要写入的数据的长度;紧接着写入相应数据

readBytes()

QDataStream &QDataStream::readBytes(char *&s, uint &l)

先从文件读取一个quint32值,该值就是将要读取的数据的长度,然后读取相应字节的数据到预先定义好的char*中

注意,readBytes() 不需要我们事先分配好内存