日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2字节十六进制浮点数 qt_Qt二进制文件操作(读和写)详解

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2字节十六进制浮点数 qt_Qt二进制文件操作(读和写)详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

除了文本文件之外,其他需要按照一定的格式定義讀寫的文件都稱為二進制文件。

每種格式的二進制文件都有自己的格式定義,寫入數據時按照一定的順序寫入,讀出時也按照相應的順序讀出。

例如地球物理中常用的 SEG-Y 格式文件,必須按照其標準格式要求寫入數據才符合這種文件的格式規范,讀取數據時也需要按照格式定義來讀出。

Qt 使用 QFile 和 QDataStream 進行二進制數據文件的讀寫:

QFile 負責文件的 IO 設備接口,即與文件的物理交互;

QDataStream 以數據流的方式讀取文件內容或寫入文件內容。

本節以實例 samp7_2 演示二進制文件的讀寫,圖 1 是程序運行的界面。

圖 1 實例 samp7_2 的二進制文件讀寫功能

實例以表格形式編輯一個數據表,采用 Model/View 結構,編輯后的數據保存為二進制文件,這與前面所講的用純文本文件存儲數據不同。

根據 QDataStream 保存文件時使用的數據編碼的方式不同,可以保存為兩種文件:

用 Qt 預定義編碼保存各種類型數據的文件,定義文件后綴為“.stm”。Qt 預定義編碼是指在寫入某個類型數據,如整形數、字符串等到文件流時,使用 Qt 預定義的編碼。可以將這種Qt預定義數據格式編碼類比于 HTML 的標記符,Qt 寫入某種類型數據時用了 Qt 預定義的標記符,讀出數據時,根據標記符讀出數據。使用 Qt 預定義編碼保存的流文件,某些字節是 QDataStream 自己寫入的,我們并不完全知道文件內每個字節的意義,但是用 QDataStream 可以讀出相應的數據。

標準編碼數據文件,定義文件后綴為“.dat”。在將數據寫到文件時,完全使用數據的二進制原始內容,每個字節都有具體的定義,在讀出數據時,只需根據每個字節的定義讀出數據即可。

實例 samp7_2 具有如下功能:

可以在表格內編輯數據,同樣的表格數據內容可以保存為兩種格式的文件,Qt預定義編碼文件(stm文件)和標準編碼文件(dat文件);

界面上的表格數據可以修改,可以添加行、插入行、刪除行;

可以讀取 stm 文件或 dat 文件,雖然文件格式不一樣,但對相同的界面數據表存儲的文件的實質內容是一樣的。

實例 samp7_2 的主窗口使用了 Model/View 結構、標準項數據模型 QStandardItemModel 和選擇模型 QItemSelectionModel,界面上使用了 QTableView 組件,還有代理組件。

這些涉及Model/View的設計可參考前面章節,這些設計在前述章節里己經介紹過,不是本節的重點,不再詳述。

為便于理解后面的程序,這里給出主窗口 MainWindow 類中自定義的一些變量和函數,具體如下(忽略了自動生成的一些定義):

class MainWindow : public QMainWindow

{

private:

QLabel *LabCellPos; //當前單元格行列號

QLabel *LabCellText; //當前單元格內容

QWIntSpinDelegate intSpinDelegate; //整型數,代理組件

QWFloatSpinDelegate floatSpinDelegate; //浮點數,代理組件

QWComboBoxDelegate comboBoxDelegate; //列表選擇,代理組件

QStandardItemModel *theModel; //數據模型

QItemSelectionModel *theSelection; //選擇模型

void resetTable (int aRowCount) ; //表格復位,設定行數 bool

saveDataAsStream (QString& aFileName) ;//保存為 stm 文件 bool

openDataAsStream (QString& aFileName) ;//打開 stm 文件

bool saveBinaryFile (QString& aFileName) ; //保存為 dat 文件

bool openBinaryFile (QString& aFileName) ; //打開 dat 文件

};

Qt預定義編碼文件的讀寫

保存為stm文件

先看文件保存功能,因為從文件保存功能的代碼可以看出文件內數據的存儲順序。在圖 1 的窗口上編輯表格的數據后,單擊工具欄上的“保存 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<

aStream<

//獲取表頭文字

for (int i=0;icolumnCount();i++)

{

QString str=theModel->horizontalHeaderItem(i)->text();//獲取表頭文字

aStream<

}

//獲取數據區的數據

for (int i=0;irowCount();i++)

{

QStandardItem* aItem=theModel->item(i,0); //測深

qint16 ceShen=aItem->data(Qt::DisplayRole).toInt();

aStream<

aItem=theModel->item(i,1); //垂深

qreal chuiShen=aItem->data(Qt::DisplayRole).toFloat();

aStream<

aItem=theModel->item(i,2); //方位

qreal fangWei=aItem->data(Qt::DisplayRole).toFloat();

aStream<

aItem=theModel->item(i,3); //位移

qreal weiYi=aItem->data(Qt::DisplayRole).toFloat();

aStream<

aItem=theModel->item(i,4); //固井質量

QString zhiLiang=aItem->data(Qt::DisplayRole).toString();

aStream<

aItem=theModel->item(i,5); //測井

bool quYang=(aItem->checkState()==Qt::Checked);

aStream<

}

aFile.close();

return true;

}

自定義函數 saveDataAsStream() 將表格的數據模型 theModel 的數據保存為一個 stm 文件。代碼首先是創建 QFile 對象 aFile 打開文件,然后創建 QDataStream 對象 aStream 與 QFile 對象關聯。

在開始寫數據流之前,為 QDataStream 對象 aStream 設置版本號,即調用 setVersion() 函數,并傳遞一個 QDataStream::Version 枚舉類型的值:

aStream.setVersion(QDataStream::Qt_5_9);

這表示 aStream 將以 QDataStream::Qt_5_9 版本的預定義類型寫文件流。

注意,以 Qt 的預定義類型編碼保存的文件需要指定流版本號,因為每個版本的 Qt 對數據類型的編碼可能有差別,需要保證寫文件和讀文件的流版本是兼容的。

接下來,就是按照需要保存數據的順序寫入文件流。例如在文件開始,先寫入行數和列數兩個qint16的整數。因為行數和列數關系到后面的數據是如何組織的,因此在讀取文件數據時,首先讀取這兩個整數,然后根據數據存儲方式的約定,就知道后續數據該如何讀取了。向文件寫入數據時,直接用流的輸入操作,如:

aStream<

aStream<

在讀取各列的表頭字符串之后,將其寫入數據流。然后逐行掃描表格的數據模型,將每一行的列數據寫入數據流。

數據流寫入數據時都使用運算符“<

QDataStream 以流操作寫入這些數據時,我們并不知道文件里每個字節是如何存儲的,但是知道數據寫入的順序,以及每次寫入數據的類型。在文件數據讀出時,只需按照順序和類型對應讀出即可。

stm文件格式

根據 saveDataAsStream() 函數的代碼,可知 Qt 預定義編碼保存的 stm 文件的格式,如表 2 所示。

表 2 以 Qt 預定義編碼保存的 stm 文件的格式定義

順序號

數據

類型

備注

1

rowCount

qintl6

行數

2

colCount

qintl6

列數

3

“Depth”

QString

表頭標題1

4

"Measured Depth"

QString

表頭標題2

5

"Direction"

QString

表頭標題3

6

"Offset"

QString

表頭標題4

7

"Quality"

QString

表頭標題5

8

"Sampled"

QString

表頭標題6

9

第1行各列數據

qint16

測深

10

qreal

垂深

11

qreal

方位

12

qreal

位移

13

QString

固井質量

14

bool

是否測井取樣

15

第2行各列數據

從表 2 中可以知道 stm 文件的數據存儲順序和類型,但是并不知道 qint16 類型的數據存儲為幾個字節以及 QString 類型的數據是如何定義長度和字符內容的,其實也不需要知道這些具體的存儲方式,在從文件讀出時,只需按照表 2 的順序和類型讀出數據即可。

讀取stm文件

下面是工具欄按鈕“打開 stm 文件”的響應代碼及相關函數代碼,選擇需要打開的 stm 文件后,主要是調用自定義函數 openDataAsStream() 將其打開:

void MainWindow::on_actOpen_triggered()

{

QString curPath=QDir::currentPath();

//調用打開文件對話框打開一個文件

QString aFileName=QFileDialog::getOpenFileName(this,tr("打開一個文件"),curPath,

"流數據文件(*.stm)");

if (aFileName.isEmpty())

return; //

if (openDataAsStream(aFileName)) //保存為流數據文件

QMessageBox::information(this,"提示消息","文件已經打開!");

}

bool MainWindow::openDataAsStream(QString &aFileName)

{ //從Qt預定義流文件讀入數據

QFile aFile(aFileName); //以文件方式讀出

if (!(aFile.open(QIODevice::ReadOnly)))

return false;

QDataStream aStream(&aFile); //用文本流讀取文件

aStream.setVersion(QDataStream::Qt_5_9); //設置流文件版本號

qint16 rowCount,colCount;

aStream>>rowCount; //讀取行數

aStream>>colCount; //列數

this->resetTable(rowCount); //表格復位

//獲取表頭文字

QString str;

for (int i=0;i

aStream>>str; //讀取表頭字符串

//獲取數據區文字,

qint16 ceShen;

qreal chuiShen;

qreal fangWei;

qreal weiYi;

QString zhiLiang;

bool quYang;

QStandardItem *aItem;

QModelIndex index;

for (int i=0;i

{

aStream>>ceShen;//讀取測深, qint16

index=theModel->index(i,0);

aItem=theModel->itemFromIndex(index);

aItem->setData(ceShen,Qt::DisplayRole);

aStream>>chuiShen;//垂深,qreal

index=theModel->index(i,1);

aItem=theModel->itemFromIndex(index);

aItem->setData(chuiShen,Qt::DisplayRole);

aStream>>fangWei;//方位,qreal

index=theModel->index(i,2);

aItem=theModel->itemFromIndex(index);

aItem->setData(fangWei,Qt::DisplayRole);

aStream>>weiYi;//位移,qreal

index=theModel->index(i,3);

aItem=theModel->itemFromIndex(index);

aItem->setData(weiYi,Qt::DisplayRole);

aStream>>zhiLiang;//固井質量,QString

index=theModel->index(i,4);

aItem=theModel->itemFromIndex(index);

aItem->setData(zhiLiang,Qt::DisplayRole);

aStream>>quYang;//bool

index=theModel->index(i,5);

aItem=theModel->itemFromIndex(index);

if (quYang)

aItem->setCheckState(Qt::Checked);

else

aItem->setCheckState(Qt::Unchecked);

}

aFile.close();

return true;

}

void MainWindow::resetTable(int aRowCount)

{ //表格復位,先刪除所有行,再設置新的行數,表頭不變

theModel->removeRows(0,theModel->rowCount()); //刪除所有行

theModel->setRowCount(aRowCount);//設置新的行數

QString str=theModel->headerData(theModel->columnCount()-1,

Qt::Horizontal,Qt::DisplayRole).toString();

for (int i=0;irowCount();i++)

{ //設置最后一列

QModelIndex index=theModel->index(i,FixedColumnCount-1); //獲取模型索引

QStandardItem* aItem=theModel->itemFromIndex(index); //獲取item

aItem->setCheckable(true);

aItem->setData(str,Qt::DisplayRole);

aItem->setEditable(false); //不可編輯

}

}

讀取 stm 文件的數據之前也必須設置 QDataStream 的流版本號,應該等于或高于數據保存時的流版本號。

然后就是按照表 2 所示的寫入數據時的順序和類型,相應地讀出每個數據。文件里最早的兩個數據是表格的行數和列數,讀出這兩個數據,就能知道數據的行數和列數,并調用自定義函數 resetTable() 給數據模型復位,并設置其行數。

然后將保存的每行數據讀入到數據模型的每個項中,這樣窗口上的 QTableView 組件就可以顯示數據了。

使用 QDataStream 的流操作方式讀寫文件的特點如下:

讀寫操作都比較方便,支持讀寫各種數據類型,包括 Qt 的一些類,還可以為流數據讀寫擴展自定義的數據類型。讀寫某種類型的數據時,只要是流支持即可,而在文件內部是如何存儲的,用戶無需關心,由Qt預定義。

寫文件和讀文件時必須保證使用的流版本兼容,即流的版本號相同,或讀取文件的流版本 號高于寫文件時的流版本號。這是因為在不同的流版本中,流支持的數據類型的讀寫方式 可能有所改變,必須保證讀寫版本的兼容。

用這種方式保存文件時,寫入數據采用 Qt 預定義的編碼,即寫入文件的二進制編碼是由 Qt 預定義的,寫多少個字節、字節是什么樣的順序,用戶是不知道的。如果是由 QDataStream 讀取數據,只需按類型讀出即可。

但是,如果由這種方法創建的文件是用于交換的,需要 用其他的編程語言(如Matlab)來讀取文件內容,則存在問題了。因為其他語言并沒有與Qt的流寫入完全一致的流讀出功能,例如,其他語言并不知道 Qt 保存的 QString 或 QFont 的內容是如何組織的。

標準編碼文件的讀寫

保存為dat文件

前面是釆用 Qt 預定義編碼讀寫 stm 文件,這種方法使用簡單,但是文件的格式不完全透明,不能創建用于交換的通用格式文件。

創建通用格式文件(即文件格式完全透明,每個字節都有具體的定義,如 SEG-Y 文件)的方法是以標準編碼方式創建文件,使文件的每個字節都有具體的定義。用戶在讀取這種文件時,按照文件格式定義讀取出每個字節數據并做解析即可,不管使用什么編程語言都可以編寫讀寫文件的程序。

主窗口工具欄上的“保存 dat 文件”按鈕將表格中的數據保存為標準編碼的文件,文件后綴是“.dat”。保存 dat 文件的代碼是:

void MainWindow::on_actSaveBin_triggered()

{//保存二進制文件

QString curPath=QDir::currentPath();

//調用打開文件對話框選擇一個文件

QString aFileName=QFileDialog::getSaveFileName(this,tr("選擇保存文件"),curPath,"二進制數據文件(*.dat)");

if (aFileName.isEmpty())

return;

if (saveBinaryFile(aFileName)) //保存為流數據文件

QMessageBox::information(this,"提示消息","文件已經成功保存!");

}

bool MainWindow::saveBinaryFile(QString &aFileName)

{ //保存為純二進制文件

QFile aFile(aFileName); //以文件方式讀出

if (!(aFile.open(QIODevice::WriteOnly)))

return false;

QDataStream aStream(&aFile); //用文本流讀取文件

aStream.setByteOrder(QDataStream::LittleEndian);//windows平臺

qint16 rowCount=theModel->rowCount();

qint16 colCount=theModel->columnCount();

aStream.writeRawData((char *)&rowCount,sizeof(qint16)); //寫入文件流

aStream.writeRawData((char *)&colCount,sizeof(qint16));//寫入文件流

//獲取表頭文字

// QString str;

QByteArray btArray;

QStandardItem *aItem;

for (int i=0;icolumnCount();i++)

{

aItem=theModel->horizontalHeaderItem(i); //獲取表頭item

QString str=aItem->text(); //獲取表頭文字

btArray=str.toUtf8(); //轉換為字符數組

aStream.writeBytes(btArray,btArray.length()); //寫入文件流,長度uint型,然后是字符串內容

}

//獲取數據區文字

qint8 yes=1,no=0; //分別代表邏輯值 true和false

for (int i=0;irowCount();i++)

{

aItem=theModel->item(i,0); //測深

qint16 ceShen=aItem->data(Qt::DisplayRole).toInt();//qint16類型

aStream.writeRawData((char *)&ceShen,sizeof(qint16));//寫入文件流

aItem=theModel->item(i,1); //垂深

qreal chuiShen=aItem->data(Qt::DisplayRole).toFloat();//qreal 類型

aStream.writeRawData((char *)&chuiShen,sizeof(qreal));//寫入文件流

aItem=theModel->item(i,2); //方位

qreal fangWei=aItem->data(Qt::DisplayRole).toFloat();

aStream.writeRawData((char *)&fangWei,sizeof(qreal));

aItem=theModel->item(i,3); //位移

qreal weiYi=aItem->data(Qt::DisplayRole).toFloat();

aStream.writeRawData((char *)&weiYi,sizeof(qreal));

aItem=theModel->item(i,4); //固井質量

QString zhiLiang=aItem->data(Qt::DisplayRole).toString();

btArray=zhiLiang.toUtf8();

aStream.writeBytes(btArray,btArray.length());

aItem=theModel->item(i,5); //測井取樣

bool quYang=(aItem->checkState()==Qt::Checked); //true or false

if (quYang)

aStream.writeRawData((char *)&yes,sizeof(qint8));

else

aStream.writeRawData((char *)&no,sizeof(qint8));

}

aFile.close();

return true;

}

字節序

在保存為標準編碼的二進制文件時,無須指定 QDataStream 的版本,因為不會用到 Qt 的類型預定義編碼,文件的每個字節的意義都是用戶自己定義的。但是如有必要,需要為文件指定字節順序,如:

aStream.setByteOrder(QDataStream::LittleEndian);

字節順序分為大端字節序和小端字節序,小端字節序指低字節數據存放在內存低地址處,高字節數據存放在內存高地址處;大端字節序則相反。

基于 X86 平臺的計算機是小端字節序的,所以 Windows 系統是小端字節序,而有的嵌入式平臺或工作站平臺則是大端字節序的。讀取一個文件時,首先需要知道它是以什么字節序存儲的,這樣才可以正確的讀出。

setByteOrder() 函數的參數是 QDataStream::ByteOrder 枚舉類型常量,QDataStream::BigEndian 是大端字節序,QDataStream::LittleEndian 是小端字節序。

writeRawData()函數

QdataStream 采用函數 writeRawData() 將數據寫入數據流,在保存 qint8、qintl6、qreal 等類型的數據時都使用這個函數,其函數原型是:

int QDataStream::writeRawData(const char *s, int len)

其中參數 s 是一個指向字節型數據的指針,len 是字節數據的長度。調用 writeRawData() 函數將會向文件流連續寫入 len 個字節的數據,這些字節數據保存在指針 s 指向的起始地址里。

例如,將 qint16 類型變量 rowCount 寫入文件的語句是:

qint16 rowCount=theModel->rowCount();

aStream.writeRawData((char *)SrowCount,sizeof(qintl6));

writeBytes()函數

在將字符串數據寫入文件時,使用的是 writeBytes() 函數,而不是 writeRawData()。

下面是 writeBytes() 函數的原型定義:

QDataStream SQDataStream::writeBytes(const char *s, uint len)

其中參數 s 是一個指向字節型數據的指針,len 是字節數據的長度。writeBytes() 在寫入數據時,會先將 len 作為一個 quint32 類型寫入數據流,然后再寫入 len 個從指針 s 獲取的數據。

writeBytes() 適合于寫入字符串數據,因為在寫入字符串之前要先寫入字符串的長度,這樣在讀取文件時,就能知道字符串的長度,以便正確讀出字符串。

例如,下面的代碼將字符串“Depth”寫入文件流:

QString str="Depth";

QByteArray btArray=str.toUtf8();

aStream.writeBytes(btArray,btArray.length());

文件中實際保存的內容見表 3。前 4 個字節是 quint32 類型的整數,表示保存數據的字節個數,這里是 5,表示后續有 5 個字節數據。從第5字節開始,是保存的字符串”Depth”的每個字符的 ASCII 碼。

表 3 writeBytes()保存內容示例

字節序號

1 2 3 4

5

6

7

8

9

字節數據(Hex)

05 00 00 00

44

65

70

74

68

內容

后續數據長度,表示有5字節

D

e

p

t

h

由于寫入文件的字符串的長度一般是不固定的,因此如果以 writeRawData() 函數寫入文件,只會寫入字符串的內容,而沒有表示字符串的長度。在文件讀出時,如果不己知字符串長度,則難以正確讀出字符串內容。而 writeBytes() 函數首先寫入了字符串的長度,在讀取文件時,先從前四個字節讀出字符串長度,知道數據有多少個字節就可以正確讀出了。

QDataStream 提供了與 writeBytes() 對應的函數 readBytes(),它可以自動讀取長度和內容,適用于字符串數據的讀取。

dat文件格式

用 saveBinaryFile() 函數保存數據為標準編碼二進制文件,文件后綴為“.dat”。根據 saveBinaryFile() 函數的內容,dat 文件的格式見表 4。

表 4 標準編碼保存的dat文件的格式定義

順序號

數據

類型

字節數

備注

1

rowCount

qint16

2

行數

2

colCount

qint16

2

列數

3

“Depth”

QString

4+5

表頭標題1

4

"Measured Depth"

QString

4+14

表頭標題2

5

” Direction”

QString

4+9

表頭標題3

6

"Offset"

QString

4+6

表頭標題4

7

"Quality"

QString

4+7

表頭標題5

8

"Sampled"

QString

4+7

表頭標題6

9

第1行各列數據

qint16

2

測深

10

qreal

8

垂深

11

qreal

8

方位

12

qreal

8

位移

13

QString

4+字符串字節數

固井質量字符串

14

15

第2行各列數據

qint8

1

是否測井取樣

在表 4 中,可以看到文件內的每個字節都是有具體定義的,這樣,無論用什么語言編寫一個文件讀取的程序,只要按照這個格式來讀取,都可以正確讀出文件內容。

dat 文件的數據是否是按照表 4 所示的順序存儲的呢?可以創建一個簡單的數據表格,保存為 dat 后綴的文件,然后用顯示文件二進制內容的軟件來查看,如 UltraEdit 或 WinHex,這些軟件在分析文件格式,編寫文件讀寫程序時特別有用。

讀取dat文件

對于保存的 dat 文件,主窗口工具欄上的“打開dat文件”按鈕可以打開保存的 dat 文件,下面是打開 dat 文件的函數 openBinaryFile() 的代碼:

bool MainWindow::openBinaryFile(QString &aFileName)

{//打開二進制文件

QFile aFile(aFileName); //以文件方式讀出

if (!(aFile.open(QIODevice::ReadOnly)))

return false;

QDataStream aStream(&aFile); //用文本流讀取文件

aStream.setByteOrder(QDataStream::LittleEndian);

qint16 rowCount,colCount;

aStream.readRawData((char *)&rowCount, sizeof(qint16));

aStream.readRawData((char *)&colCount, sizeof(qint16));

this->resetTable(rowCount);

//獲取表頭文字,但是并不利用

char *buf;

uint strLen; //也就是 quint32

for (int i=0;i

{

aStream.readBytes(buf,strLen);//同時讀取字符串長度,和字符串內容

QString str=QString::fromLocal8Bit(buf,strLen); //可處理漢字

}

//獲取數據區數據

QStandardItem *aItem;

qint16 ceShen;

qreal chuiShen;

qreal fangWei;

qreal weiYi;

QString zhiLiang;

qint8 quYang; //分別代表邏輯值 true和false

QModelIndex index;

for (int i=0;i

{

aStream.readRawData((char *)&ceShen, sizeof(qint16)); //測深

index=theModel->index(i,0);

aItem=theModel->itemFromIndex(index);

aItem->setData(ceShen,Qt::DisplayRole);

aStream.readRawData((char *)&chuiShen, sizeof(qreal)); //垂深

index=theModel->index(i,1);

aItem=theModel->itemFromIndex(index);

aItem->setData(chuiShen,Qt::DisplayRole);

aStream.readRawData((char *)&fangWei, sizeof(qreal)); //方位

index=theModel->index(i,2);

aItem=theModel->itemFromIndex(index);

aItem->setData(fangWei,Qt::DisplayRole);

aStream.readRawData((char *)&weiYi, sizeof(qreal)); //位移

index=theModel->index(i,3);

aItem=theModel->itemFromIndex(index);

aItem->setData(weiYi,Qt::DisplayRole);

aStream.readBytes(buf,strLen);//固井質量

zhiLiang=QString::fromLocal8Bit(buf,strLen);

index=theModel->index(i,4);

aItem=theModel->itemFromIndex(index);

aItem->setData(zhiLiang,Qt::DisplayRole);

aStream.readRawData((char *)&quYang, sizeof(qint8)); //測井取樣

index=theModel->index(i,5);

aItem=theModel->itemFromIndex(index);

if (quYang==1)

aItem->setCheckState(Qt::Checked);

else

aItem->setCheckState(Qt::Unchecked);

}

aFile.close();

return true;

}

字節序

在流創建后,需要用 setByteOrder() 函數指定字節序,并且與寫入文件時用的字節序一致。

readRawData()函數

在讀取基本類型數據時,使用 QDataStream 的 readRawData() 函數,該函數原型為:

int QDataStream::readRawData(char *s, int len)

它會讀取 len 個字節的數據,并且保存到指針 s 指向的存儲區。例如:

qint16 rowCount;

aStream.readRawData((char *)SrowCount, sizeof(qintl6));

readBytes()函數

讀取字符串時使用 readBytes() 函數,它是與 writeBytes() 功能對應的函數,其函數原型為:

QDataStream SQDataStream::readBytes(char *&s, uint &len)

對應表格 3,使用 readBytes() 函數時,會先自動讀取前 4 個字節數據作為 quint32 的數據,并賦值給 len 參數,因為 len 是以引用方式傳遞的參數,所以,len 返回讀取的數據的字節數。然后根據 len 的大小讀取相應字節的數據,存儲到指針 s 指向的存儲區。

總結

以上是生活随笔為你收集整理的2字节十六进制浮点数 qt_Qt二进制文件操作(读和写)详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。