2014-01-10 65 views
2

我創建了函數Qt來讀取二進制文件,它工作。Datastream Qt到標準C++代碼

[代碼]

if (fileLoad.open(QIODevice::ReadOnly)) 
    { 
    QDataStream in(&fileLoad); 

    quint8 Variable_8bits; 
    quint16 Variable_16bits; 
    quint32 Variable_32bits; 

    in >> Variable_16bits >> Variable_8bits >> Variable_32bits >> ZeroByte; 

    qDebug() << Variable_16bits << Variable_8bits << Variable_32bits; 

    //Works no extreme conversion necessary as i read input with "set size variables" 
    // first 16bits, then 8bits, then 32bits 
    // and store it correctly for display 
    } 
    fileLoad.close(); 
    } 

所以基本上我可以在一個二進制文件中讀取,使用不同大小的變量來訪問的值的文件中(因爲我知道文件結構的格式)

我的問題是,現在我需要爲標準C++函數創建相同或相似的功能。

有沒有像Qt的數據流用於C++ 還是我必須文件手動加載到緩衝器中, 然後讀取單個字節, 做逐位操作,以得到正確的表示長度, i前顯示值 或如果有一個更簡單的方法...

什麼前進,我會用std::ifstream的表現爲這個簡單的用例的方式......

+0

Qt版本的問題究竟是什麼?你不能在某個平臺上使用它,或者一般Qt有什麼問題?另外,你需要支持pre-C++ 11工具鏈嗎?你看過std :: ifstream嗎? – lpapp

+1

@ 2lights請注意,'QDataStream'不適用於讀寫任何二進制文件。它使用自己的序列化格式,用於讀取和寫入。格式很簡單,所以對於* some *類型,序列化格式與將原始字節直接從內存寫入文件相同,但是爲此目的使用'QDataStream'的好處是可疑的。 – hyde

+0

@hyde:我同意。 – lpapp

回答

0

如下所示。

但是,請注意,8, 16, and 32 bit types僅添加到C++ 11和標準中。

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string line; 
    ifstream myfile("example.txt", std::ios::binary); 
    uint8_t Variable_8bits; // C++11 and on 
    uint16_t Variable_16bits; // C++11 and on 
    uint32_t Variable_32bits; // C++11 and on 
    if (myfile.is_open()) 
    { 
     myfile.read(&Variable_16bits, 2); 
     myfile.read(&Variable_8bits, 1); 
     myfile.read(&Variable_32bits, 4) 
     ... 

     std::out << Variable_16bits << Variable_8bits << Variable_32bits; 
     myfile.close(); 
    } else { 
     cout << "Unable to open file"; 
    } 

    return 0; 
} 
+0

運營商:''''''iostream中的''''僅適用於TEXT STREAMS!問題是關於二進制流。 –

+0

@MarekR:過時,考慮刪除您的評論。 – lpapp

+0

你爲什麼在沒有評論的情況下投下我的答案?你的解決方案是處理endians還是不同的浮點標準? –

0

在標準C++中,沒有功能/類的功能類似於QDataStream。 請注意,QDataStream類提供了對多種體系結構的支持,它考慮了endians(默認假設爲大端),不同標準的浮點值,它控制了構建類型的大小。 (它也支持一些Qt類的內化和外化,但是這個問題不適用於標準C++)
在標準C++中,所有這些平臺的多樣性必須手動(或按庫)處理。

+0

請在評論的時候進行評論我希望知道爲什麼我我錯了(或不是) –

+0

我會給你_my_個人意見:OP的問題似乎與浮動,「內部化」(對於整數?)或「外部化等等,恕我直言,沒有任何關係。 – lpapp