Qt 二进制文件读写

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();

 

  • 8
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值