QTextStream 类(文本流)和QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下:
①、QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或QByteArray 上运行,比如把数据输出到 QString、QIODevice 或QByteArray 对象上,或进行相反的操作。
②、QDataStream 类:用于对数据进行二进制格式的读/写操作,QDataStream 只可在QIODevice 或QByteArray 上运行,因为 QString 只存放字符数据
QIODevice 类是 Qt 中所有 I/O 设备的基础接口类(这是一个抽象类),也就是说 QIODevice及其子类描述的是 I/O 设备,该类为支持读/写数据块的设备提供了通用实现和抽象接口,比如 QFile、QBuffer、QTcpSocket 等
QIODevice 把设备分为两类:随机存储设备和顺序存储设备
①、随机存储设备:可定位到任意位置(使用 seek()函数),随机存储设备有 QFile,QTemporaryFile,QBuffer
②、顺序存储设备:不支持任意的位置存储,顺序存储设备有 QProcess、QTcpSocket、QUdpSocket 和QSslSocket
QBuffer 类为 QByteArray 提供了一个 QIODevice 接口,以允许使用 QIODevice 接口来访问 QByteArray。默认情况下,创建一个 QBuffer 时,会自动在内部创建一个 QByteArray缓冲区

QDataStream 类

字节序:即多字节数据(即大于一个字节的数据)在内存中的存储顺序,有如下两种方式
Little-Endian(LE,小端):即低位字节存储在低地址端,高位字节存储在高地址端
Big-Endian(BE,大端):即高位字节存储在低地址端,低位字节储倣在高地址端。这是 QDataStream 的默认字节序。
比如对于整数 0x2345,若按 big-endian(大端)顺序存储,则按 0x23、0x45 的顺序存储,若按 little-endian(小端)顺序存储,则以 0x45、0x23 的顺序存储
QDataStream 实现了基本的 C++数据类型的序列化,比如 char,short,int,char *等。更复杂的数据类型的序列化是通过分解原始单元来完成的
QDataStream 支持的 Qt 类型有 QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant 等类型,还包括容器类型,比如 QList、QVector、QSet、QMap 等
对于整数,建议始终转换为 Qt 整数类型(比如 qint32 等)进入写入,并将其读入为相同的Qt整数类型,这样可以确保获取确定的大小的整数,以避免编译器和平台差异的影响(注:C++语法只规定了 int,short 等类型的最小长度,未规定最大长度)

QDataStream读写文件

win.h
#ifndef WIN_H #define WIN_H #include#include#include#includeclass Win :public QWidget { Q_OBJECT public: Win(QWidget*parent = nullptr);~Win(); private: QPushButton*pb; QFile* f; }; #endif// WIN_H
win.cpp
#include"win.h" Win::Win(QWidget*parent) : QWidget(parent) {this->resize(300,200); pb=new QPushButton("AAA",this); pb->move(10,10); f=new QFile("l.txt"); f->open(QIODevice::WriteOnly);//以只写方式打开文本l.txt QIcon i("l.jpg"); QPoint p(22,22); QDataStreamout(f);//创建QDataStream对象并与QFile对象关联out