因爲我必須用二進制文件處理很多文件,所以我想要一個更抽象的方式來做到這一點,我必須反覆執行相同的循環:在C++中定義一個二進制文件的結構11
- 寫在一個給定的順序的頭
- 寫不同類型的塊(與組不同的值)
- 寫一個可選的收盤頭
現在我想打破這問題在sm所有的構建塊,想象一下,如果我可以寫一些類似於XML的DTD的內容,可以定義在給定塊之後或給定語義內的內容,所以我可以根據構建塊來考慮我的文件十六進制值或類似的東西,也代碼將更「地道」,而不是神祕。
最後,有什麼語言可以幫助我從這個未來的二進制文件?
因爲我必須用二進制文件處理很多文件,所以我想要一個更抽象的方式來做到這一點,我必須反覆執行相同的循環:在C++中定義一個二進制文件的結構11
現在我想打破這問題在sm所有的構建塊,想象一下,如果我可以寫一些類似於XML的DTD的內容,可以定義在給定塊之後或給定語義內的內容,所以我可以根據構建塊來考慮我的文件十六進制值或類似的東西,也代碼將更「地道」,而不是神祕。
最後,有什麼語言可以幫助我從這個未來的二進制文件?
我不確定C++ 11的特定功能,但對於C++來說,一般來說,流使得文件I/O更易於使用。您可以重載流插入(< <)和流提取(>>)操作符以實現您的目標。如果您對操作符重載不太熟悉,可以參考this site的第9章,以及很多示例。以下是特定的page,用於在流上下文中重載< <和>>運算符。
請允許我說明我的意思。假設我們定義了幾個類:
然後,您可以重載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類。
您可以以類似的方式重載流提取操作符(>>),儘管解析可能需要一些額外的工作。
希望這會有所幫助。
如果你真的很聰明,你的流輸入和流輸出函數可以合併成一個函數,並使用布爾標誌來切換你是讀還是寫,因爲大部分時間你的流輸入和流無論如何,你的類的輸出函數是相同的。 –
我想如果語法不在那裏,它不在那裏,我試圖用更抽象的東西來避免這種程序和程序風格。 – user2485710
@JaminGrey你的意思是模板化一個int/bool的值,或者把一個if/else放在1的函數中? – user2485710
在語言中?不。升序序列化可能會幫助你,雖然它的序列化不是很便攜。 –