QDataStream类实现了将QIODevice的二进制数据串行化。一个数据流就是一个二进制编码信息流 ,它完全独立于主机的操作系统,cpu和字节顺序。数据流可以读写未编码的原始二进制数据。QDataStream类可以实现C++基本数据类型的串行化,比如char,short int,int,char*等。串行化更复杂的数据是通过将数据分解为基本的数据类型来完成的。
#include <QCoreApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>
#include <QFileInfo>
struct MyData
{
int num;
char ch[2];
bool b;
double d;
qint16 count;
};//4+2+1+8+2=1
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//将二进制数据写入到数据流中
QFile file("myFile.dat");
QFileInfo info(file);
qDebug()<<info.absoluteFilePath();
if(!file.open(QIODevice::WriteOnly))
{
qDebug()<<file.errorString();
}
QDataStream out(&file);
out<<QString("the answer is");
out<<(qint32)42;
file.flush();
file.close();
//从数据流中读取二进制数据
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<file.errorString();
}
QDataStream in(&file);
QString str;
qint32 num;
in>>str>>num;
file.close();
//写入结构体
QFile file2;
file2.setFileName("myFile2.dat");
if(!file2.open(QIODevice::WriteOnly))
{
qDebug()<<file.errorString();
}
MyData data;
data.b = true;
data.num = 64;
data.count = 16;
data.ch[0] = 'a';
data.ch[1] = 'b';
data.d = 3.1415926;
QDataStream out2(&file2);
out2.writeBytes((const char*)&data,sizeof(MyData));
file2.flush();
file2.close();
//读取结构体
if(!file2.open(QIODevice::ReadOnly))
{
qDebug()<<file.errorString();
}
QDataStream in2(&file2);
char *pBuf = new char[sizeof(MyData)];
uint count;
in2.readBytes(pBuf,count);
MyData* pData = (MyData*)pBuf;
qDebug()<<pData->b;
qDebug()<<pData->ch;
qDebug()<<pData->count;
qDebug()<<pData->d;
qDebug()<<pData->num;
file2.close();
return a.exec();
}