QT学习笔记 QDataStream类

对于QDataStream的使用,最初是为了通过qt读取文件,然后下载到其他设备。QDataStream提供了一种通过二进制数据流来直接读取文件的方式,读取之后可以写入到其他地方,解析之后将数据下发出去。这里要注意的是,读出来的二进制文件没有任何编码,事实上根本没有经过编码,压根就没有数据类型转换的过程。如果通过这种方式读取文件,为了能让人读懂内容必须要转换成其他类型,包括:char、short、int、char*等。

我们先来看一下如何通过QDataStream来读取文件,

    QFile aFile("file.dat");  //定义一个文件,file.dat
    char* temData = new char[200];
    if (!(aFile.open(QIODevice::ReadOnly)))//用只读的方式打开文件
        return false;
    QDataStream aStream(&aFile); //定义一个数据流,指向file.dat
    aStream.readRawData(temData, 200);//读取数据,存入temData

实际上,读取的方法还有一种,就是直接从流里面读取出来,参照豆神的教程,可以这么写:

    QFile aFile("file.dat");  //定义一个文件,file.dat
    QString str;
    qint32 tem;
    if (!(aFile.open(QIODevice::ReadOnly)))//用只读的方式打开文件
        return false;
    QDataStream aStream(&aFile); //定义一个数据流,指向file.dat
    aStream >> tem >> str;//读取数据,存入tem和str

这么写有个问题,从数据流中读取的数据顺序是有要求的,必须按照写入的顺序来,假设你读取的文件不是你写的,你完全不知道里面有什么,这种方式就不可行。因为如果顺序错误的话,有可能导致程序直接崩溃了。在这样的前提下,如果非得要这要读,那么文件最好是你自己写的,或者清楚知道数据写入的顺序。我们举个例子,如果要使得上面的读取方法可行,就必须要采用下面的写入方法:

    QFile aFile("file.dat");
    if (!(aFile.open(QIODevice::WriteOnly)))//用只写的方式打开文件
        return false;
    QDataStream aStream(&aFile);
    bStream << qint32(3);
    bStream << QString("apples");

分析一下上面的写入和读取的顺序。写入的时候,先写入qint32的整形数据,再写入QString的字符串;读取的时候,也是先读取了整形数据tem,再读取了字符串str。写入和读取的顺序是对应的。但是,如果采用readRowData函数来读取,就没有写入顺序要求,即使文件是外来的,不清楚其中的顺序,也可以读取。

还有一个问题,不同的QT版本也可能带来麻烦,所以数据流这里,可以指定数据流的QT版本,咱们举个例子:

    QFile aFile("file.dat");
    if (!(aFile.open(QIODevice::WriteOnly)))//用只写的方式打开文件
        return false;   
    out.setVersion(QDataStream::Qt_5_5);//指定QT版本号
    out << QString("magic Num");    // 写入数据

实际上,二进制文件是给机器看的,用户无法分辨其真假,也不知道是否是发错了,所以,二进制文件一般会用魔术数字来标志文件类型,这样用户就可以判断这个文件是否合法,版本是否对的上。魔术数字可以在文件的开头写入,方法和上面的写入数据的方法一样。

最后一个问题,QDataStream可以通过游标来控制读写的位置,这个游标就相当于一个指针,它指在哪里,就在它的后面进行读写操作。试想一下,如果我们先写入数据,关闭文件或者刷新文件,接着就读取,会读出数据吗?答案是否定的。因为写完数据之后,游标是在文件的最末尾,这个时候读取文件,游标后面什么也没有。实际上,这里的“<<”已经被重新定义了,所以,正确的操作应该是这样的:

    QFile aFile("file.dat");
    QString str;
    qint32 tem;
    if (!(aFile.open(QIODevice::WriteOnly)))//用只写的方式打开文件
        return false;   
    QDataStream aStream(&aFile);
    bStream << qint32(3); //写入数据
    bStream << QString("apples");
    bStream.device()->seek(0);//游标回到文件最开始的地方,必须有这一步!
    aFile.fush(); //这一步是刷新文件,让写进去的文件生效
    //aFile.close();
    aStream >> tem >> str;//读取数据,存入tem和str  
    qDebug() << str << tem;//打印出来看看结果

上面的代码中有一句刷新文件用的是flush,实际上如果没有这一步操作,读取数据也会是空的,因为写入操作并没有生效。必须要刷新一下,或者不刷新,直接关闭文件,也就是被屏蔽的这句“aFile.close()”,也可以使得写入操作生效。

差不多就是这些。

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值