QT输入输出(一) 之 QDataStream 测试

 

QT提供了两个高级别的流类---QDataStream和QTextStream,可以从任意的输入输出设备读取或写入数据。

QDataStream用于读写二进制数据,它的优点是:在读写数据的时候已经严格定义了数据流的类型和每个类型的长度,这样就不用关心编码之间转换的问题了。

QTextStream用于读写文本(如HTML、XML和源代码等)的格式,解决了二进制文件格式无法直接阅读和编辑的缺点。QTextStream考虑了Unicode编码与系统本地编码或其他编码之间的转换问题,并考虑了不同操作系统之间行尾符切换的问题(MS “\r\n”, Mac “ \n”)。

QTextStream使用16位的QChar类型作为基本数据单元,并支持数字类型和字符串类型的转换。

 


现在先对QDataStream测试:


(一)先看测试代码

 

#include <QCoreApplication>

#include<QDataStream>

#include<QFile>

#include<QHash>

#include<iostream>

#include<QDebug>



int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);



QHash<int, QString> hash;

hash.insert(0, "working");

hash.insert(1, "hard");

hash.insert(2, "!");

QString str("this is a QDataStream test  ");

QFile file("test.dat");

if(!file.open(QIODevice::WriteOnly))

{

    std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;

   // return;

}

QDataStream out(&file);

out.setVersion(QDataStream::Qt_4_3);

out<<quint32(0x12345678)<<str<<hash;



if(!file.flush())

{

    qDebug("write faile");

}





QFile file_in("test.dat");

if(!file_in.open(QIODevice::ReadOnly))

{

     std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;



}

QDataStream in(&file_in);

in.setVersion(QDataStream::Qt_4_3);

quint32 c;

QHash<int, QString> b;

QString str1;

in>> c >> str1 >> b;

qDebug()<<c <<endl<<str1<<endl;

QHash<int, QString>::const_iterator j;

for(j = b.constBegin(); j != b.constEnd(); j++)

qDebug()<<j.key()<<"  "<<j.value()<<endl;





    return a.exec();

}


(二)测试结果

 

QT输入输出(一) 之 QDataStream 测试

(三)总结

1、

std::cerr<<"cannotopenfiletest.dat:"<<qPrintable(file.errorString())<<std::endl;
才用标准错误输出,qPrintable()函数将QString转换为C++标准的 const char* 字符串。
也可采用QString.toStdString(),返回C++ string类型。
2、
由于QT中不同版本有不同的QT数据类型的表示方式,所以在输入输出时最好设置统一的版本号(版本号是一个整数),保持存储、接收数据的一致性。
out.setVersion(QDataStream::Qt_4_3);
in.setVersion(QDataStream::Qt_4_3);
3、
QDataStream默认采用大端(big-endian)方式存储32位整数,所以为了在所有平台上确保0x12345678表示的都是32位无符号数,采用了quint的强制类型转换
 
  
quint32(0x12345678)
4、
if(!file.flush())

{

    qDebug("write faile");

}
在《C++ GUI QT 4》中,没有加入这一句,所以会出现数据无法写入文件的问题,当然也无法读到数据。是因为,写操作是把数据写到缓冲区,交给操作系统完成写到文件的任务,但是操作系统是多任务的,不会立即把缓冲区的数据写到文件,所以最好强制把缓冲区的数据写到文件。
 
 
  

 

你可能感兴趣的:(DataStream)