QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。结合QIODevice,QDataStream可以很方便地对文件、网络套接字等进行读写操作。
代码实现如下:
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDataStream>
#include<QFile>
#include<QFileDialog>
#include<QDebug>
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]" //这样写可以方便地定位错误
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::on_Button_open_clicked()
{
QString path=QFileDialog::getOpenFileName(this,"open_File","../08_QDataStream","*.*");
if(!path.isEmpty())
{
//创建文件对象
QFile file(path);
//打开文件,只读方式
bool isOK=file.open(QIODevice::ReadOnly);
if(isOK)
{
//创建数据流,和file文件关联
QDataStream stream(&file);
//读的时候,按写的顺序取数据
QString str;
int a;
stream>>str>>a;
//qDebug()<<str.toUtf8().data()<<a;
cout<<str.toUtf8().data()<<a;
}
//关闭文件
file.close();
}
}
void MyWidget::on_Button_save_clicked()
{
QString path= QFileDialog::getSaveFileName(this,"save_File","../08_QDataStream","TXT(*.txt)");
if(!path.isEmpty())
{
//QFile file(path);
QFile file;
file.setFileName(path);
//打开方式,只写
bool isOK=file.open(QIODevice::WriteOnly);
if(isOK)
{
//创建数据流,和file文件关联
QDataStream stream(&file);
//获取编辑区内容
QString str=ui->textEdit->toPlainText();
//往数据流中写数据,相当于往文件中写数据
stream<<str<<666;
}
file.close();
}
}