1.方法
Qt 使用 QFile 和 QDataStream 进行二进制数据文件的读写:
- QFile 负责文件的 IO 设备接口,即与文件的物理交互;
- QDataStream 以数据流的方式读取文件内容或写入文件内容。
QDataStream 保存文件时使用的数据编码的方式不同,可以保存为两种文件:
- 用 Qt 预定义编码保存各种类型数据的文件,定义文件后缀为“.stm”。Qt 预定义编码是指在写入某个类型数据,如整形数、字符串等到文件流时,使用 Qt 预定义的编码。可以将这种Qt预定义数据格式编码类比于 HTML 的标记符,Qt 写入某种类型数据时用了 Qt 预定义的标记符,读出数据时,根据标记符读出数据。使用 Qt 预定义编码保存的流文件,某些字节是 QDataStream 自己写入的,我们并不完全知道文件内每个字节的意义,但是用 QDataStream 可以读出相应的数据。
- 标准编码数据文件,定义文件后缀为“.dat”。在将数据写到文件时,完全使用数据的二进制原始内容,每个字节都有具体的定义,在读出数据时,只需根据每个字节的定义读出数据即可。
2.Qt预定义编码文件的读写
保存为stm文件
数据流写入数据时都使用运算符“<<”,不论写的是 qint16、qreal 还是字符串。
除了可以写入基本的数据类型外,QDataStream 流操作还可以写入很多其他类型的数据,如 QBrush、QColor, QImage、QIcon 等,这些称为可序列化的数据类型(Serializing Qt Data Types)。
QString fileName = "test.stm";
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
return false;
//流读取文件
QDataStream stream(&file);
//设置版本号,写入和读取的版本号要兼容
stream.setVersion(QDataStream::Qt_5_9);
//写入流
QString name = "张三";
int age = 18;
QColor color("red");
stream<<name;
stream<<age;
stream<<color;
关闭文件
file.close();
读取stm文件
QString fileName = "test.stm";
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
return false;
//流读取文件
QDataStream stream(&file);
//设置版本号,写入和读取的版本号要兼容
stream.setVersion(QDataStream::Qt_5_9);
QString name;
int age = 0;
QColor color;
//输出流
stream>>name;
stream>>age;
stream>>color;
//关闭文件
file.close();
3.标准编码文件的读写
保存为dat文件
创建通用格式文件(即文件格式完全透明,每个字节都有具体的定义,如 SEG-Y 文件)的方法是以标准编码方式创建文件,使文件的每个字节都有具体的定义。用户在读取这种文件时,按照文件格式定义读取出每个字节数据并做解析即可,不管使用什么编程语言都可以编写读写文件的程序。
QString fileName = "test.dat";
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
return false;
//流读取文件
QDataStream stream(&file);
//windows平台
stream.setByteOrder(QDataStream::LittleEndian);
//写入流
stream<<QString("张三");
stream<<qint32(18);
//关闭文件
file.close();
读取dat文件
QString fileName = "test.dat";
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
return false;
//流读取文件
QDataStream stream(&file);
//windows平台
stream.setByteOrder(QDataStream::LittleEndian);
QString name;
int age = 0;
//输出流
stream>>name;
stream>>age;
//关闭文件
file.close();