【QT】二进制文件读写

Qt使用QFile和QDataStream进行二进制数据文件的读写。QFile负责文件的IO设备接口,即与文件的物理交互,QDataStream以数据流的方式读取文件内容或写入文件内容。 根据QDataStream保存文件时使用的数据编码的方式不同,可以保存为两种文件。(1)用Qt预定义编码保存各种类型数据的文件,定义文件后缀为“stm”。(2)标准编码数据文件,定义文件后缀为".dat”。 本节以实例samp7_2演示二进制文件的读写。
摘要由CSDN通过智能技术生成
       文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。

1 实例功能概述

        除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件。每种格式 的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序 读出。例如地球物理中常用的SEG-Y格式文件,必须按照其标准格式要求写入数据才符合这种文 件的格式规范,读取数据时也需要按照格式定义来读出。
        Qt使用QFile和QDataStream进行二进制数据文件的读写。QFile负责文件的IO设备接口, 即与文件的物理交互,QDataStream以数据流的方式读取文件内容或写入文件内容。
        本节以实例samp7_2演示二进制文件的读写,图7-2是程序运行的界面。
图7-2   实例samp7_2的二进制文件读写功能
        实例以表格形式编辑一个数据表,采用Model/View结构,编辑后的数据保存为二进制文件。
        根据QDataStream保存文件时使用的数据编码的方式不同,可以保存为两种文件。
    (1)用Qt预定义编码保存各种类型数据的文件,定义文件后缀为“stm”。Qt预定义编码是指 在写入某个类型数据,如整形数、字符串等到文件流时,使用Qt预定义的编码。可以将这种Qt预 定义数据格式编码类比于HTML的标记符,Qt写入某种类型数据时用了Qt预定义的标记符,读出 数据时,根据标记符读出数据。使用Qt预定义编码保存的流文件,某些字节是QDataStream自己写 入的,我们并不完全知道文件内每个字节的意义,但是用QDataStream可以读出相应的数据。
(2)标准编码数据文件,定义文件后缀为".dat”。在将数据写到文件时,完全使用数据的二进 制原始内容,每个字节都有具体的定义,在读出数据时,只需根据每个字节的定义读出数据即可。
        实例samp7_2具有如下功能:
  • 可以在表格内编辑数据,同样的表格数据内容可以保存为两种格式的文件,Qt预定义编 码文件(文件)和标准编码文件(dat文件);
  • 界面上的表格数据可以修改,可以添加行、插入行、删除行;
  • 可以读取stm文件或文件,虽然文件格式不一样,但对相同的界面数据表存储的文件 的实质内容是一样的。
        实例samp7_2的主窗口使用了Model/View结构、标准项数据模型QStandardItemModel和选 择模型QItemSelectionModel,界面上使用了QTableView组件,还有代理组件。
        为便于理解后面的程序,这里给出主窗口MainWindow类中自定义的一些变量和函数,具体 如下(忽略了自动生成的一些定义):
class MainWindow : public QMainWindow
{
private:
//用于状态栏的信息显示
    QLabel  *LabCellPos;    //当前单元格行列号
    QLabel  *LabCellText;   //当前单元格内容
    QWIntSpinDelegate    intSpinDelegate; //整型数
    QWFloatSpinDelegate  floatSpinDelegate; //浮点数
    QWComboBoxDelegate   comboBoxDelegate; //列表选择
    QStandardItemModel  *theModel;//数据模型
    QItemSelectionModel *theSelection;//Item选择模型
    void    resetTable(int aRowCount);  //表格复位,设定行数
    bool    saveDataAsStream(QString& aFileName);//将数据保存为数据流文件
    bool    openDataAsStream(QString& aFileName);//读取数据流文件
    bool    saveBinaryFile(QString& aFileName);//保存为二进制文件
    bool    openBinaryFile(QString& aFileName);//打开二进制文件
};

2 Qt预定义编石马文件的读写

2.1 保存为文件

        先看文件保存功能,因为从文件保存功能的代码可以看出文件内数据的存储顺序。在图7-2 的窗口上编辑表格的数据后,单击工具栏上的“保存stm文件”,可以使用Qt预定义编码方式保 存文件。此按钮的响应代码如下:
void MainWindow::on_actSave_triggered()
{ //以Qt预定义编码保存数据文件
    QString curPath=QDir::currentPath();
    QString aFileName=QFileDialog::getSaveFileName(this,tr("选择保存文件"),curPath, "Qt预定义编码数据文件(*.stm)");
    if (aFileName.isEmpty())
        return; 
   if  (saveDataAsStream(aFileName)) //保存为流数据文件
       QMessageBox::information(this,"提示消息","文件已经成功保存!");
}

bool MainWindow::saveDataAsStream(QString &aFileName)
{//将模型数据保存为Qt预定义编码的数据文件
    QFile aFile(aFileName);  //以文件方式读出
    if (!(aFile.open(QIODevice::WriteOnly | QIODevice::Truncate)))
        return false;
    QDataStream aStream(&aFile);
    aStream.setVersion(QDataStream::Qt_5_9); //设置版本号,写入和读取的版本号要兼容
    qint16  rowCount=theModel->rowCount(); //数据模型行数
    qint16  colCount=theModel->columnCount(); //数据模型列数
    aStream<<rowCount; //写入文件流,行数
    aStream<<colCount;//写入文件流,列数
//获取表头文字
    for (int i=0;i<theModel->columnCount();i++)
    {
        QString str=theModel->horizontalHeaderItem(i)->text();//获取表头文字
        aStream<<str; //字符串写入文件流,Qt预定义编码方式
    }

//获取数据区的数据
    for (int i=0;i<theModel->rowCount();i++)
    {
        QStandardItem* aItem=theModel->item(i,0); //测深
        qint16 ceShen=aItem->data(Qt::DisplayRole).toInt();
        aStream<<ceShen;// 写入文件流,qint16

        aItem=theModel->item(i,1); //垂深
        qreal chuiShen=aItem->data(Qt::DisplayRole).toFloat();
        aStream<<chuiShen;//写入文件流, qreal

        aItem=theModel->item(i,2); //方位
        qreal fangWei=aItem->data(Qt::DisplayRole).toFloat();
        aStream<<fangWei;//写入文件流, qreal

        aItem=theModel->item(i,3); //位移
        qreal weiYi=aItem->data(Qt::DisplayRole).toFloat();
        aStream<<weiYi;//写入文件流, qreal

        aItem=theModel->item(i,4); //固井质量
        QString zhiLiang=aItem->data(Qt::DisplayRole).toString
  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冷凝女子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值