2013-07-15 60 views
1

因爲我必須用二進制文件處理很多文件,所以我想要一個更抽象的方式來做到這一點,我必須反覆執行相同的循環:在C++中定義一個二進制文件的結構11

  • 寫在一個給定的順序的頭
  • 寫不同類型的塊(與組不同的值)
  • 寫一個可選的收盤頭

現在我想打破這問題在sm所有的構建塊,想象一下,如果我可以寫一些類似於XML的DTD的內容,可以定義在給定塊之後或給定語義內的內容,所以我可以根據構建塊來考慮我的文件十六進制值或類似的東西,也代碼將更「地道」,而不是神祕。

最後,有什麼語言可以幫助我從這個未來的二進制文件?

+1

在語言中?不。升序序列化可能會幫助你,雖然它的序列化不是很便攜。 –

回答

3

我不確定C++ 11的特定功能,但對於C++來說,一般來說,流使得文件I/O更易於使用。您可以重載流插入(< <)和流提取(>>)操作符以實現您的目標。如果您對操作符重載不太熟悉,可以參考this site的第9章,以及很多示例。以下是特定的page,用於在流上下文中重載< <和>>運算符。

請允許我說明我的意思。假設我們定義了幾個類:

  1. BinaryFileStream - 它表示您正在嘗試寫入和(可能)讀取的文件。
  2. BinaryFileStreamHeader - 表示文件頭。
  3. BinaryFileStreamChunk - 表示一個塊。
  4. BinaryFileStreamClosingHeader - 它代表結尾標題。

然後,您可以重載BinaryFileStream中的流插入和提取操作符以寫入和讀取文件(或任何其他istream或ostream)。

... 
#include <iostream> // I/O stream definitions, you can specify your overloads for 
        // ifstream and ofstream, but doing so for istream and ostream is 
        // more general 

#include <vector> // For holding the chunks 

class BinaryFileStream 
{ 
public: 
... 
    // Write binary stream 
    friend const std::ostream& operator<<(std::ostream& os, const BinaryFileStream& bfs) 
    { 
     // Write header 
     os << bfs.mHeader; 

     // write chunks 
     std::vector<BinaryFileStreamChunk>::iterator it; 
     for(it = bfs.mChunks.begin(); it != bfs.mChunks.end(); ++it) 
     { 
      os << (*it); 
     } 

     // Write Closing Header 
     os << bfs.mClosingHeader; 

     return os; 
    } 
... 
private: 
    BinaryFileStreamHeader    mHeader; 
    std::vector<BinaryFileStreamChunk> mChunks; 
    BinaryFileStreamClosingHeader  mClosingHeader; 
};  

所有你必須做的話,是有運算符重載爲您BinaryFileStreamHeader,他們的數據轉換成相應的二進制表示BinaryFileStreamChunk和BinaryFileStreamClosingHeader類。

您可以以類似的方式重載流提取操作符(>>),儘管解析可能需要一些額外的工作。

希望這會有所幫助。

+0

如果你真的很聰明,你的流輸入和流輸出函數可以合併成一個函數,並使用布爾標誌來切換你是讀還是寫,因爲大部分時間你的流輸入和流無論如何,你的類的輸出函數是相同的。 –

+0

我想如果語法不在那裏,它不在那裏,我試圖用更抽象的東西來避免這種程序和程序風格。 – user2485710

+0

@JaminGrey你的意思是模板化一個int/bool的值,或者把一個if/else放在1的函數中? – user2485710

相關問題