在我當前的項目中,我有很多不同格式的二進制文件。其中有幾個作爲簡單的檔案,因此我試圖想出一個很好的方法將提取的文件數據傳遞給其他類。分割文件並將數據傳遞給其他類
這是我目前的做法的一個簡單的例子:
class Archive {
private:
std::istream &fs;
void Read();
public:
Archive(std::istream &fs); // Calls Read() automatically
~Archive();
const char* Get(int archiveIndex);
size_t GetSize(int archiveIndex);
};
class FileFormat {
private:
std::istream &fs;
void Read();
public:
FileFormat(std::istream &fs); // Calls Read() automatically
~FileFormat();
};
存檔類基本分析存檔和讀取存儲的文件到char
指針。 爲了從Archive
加載第FileFormat
文件,我將目前使用下面的代碼:(請注意,在存檔一些文件可能有其他的檔案,但不同的格式)
std::ifstream fs("somearchive.arc", std::ios::binary);
Archive arc(fs);
std::istringstream ss(std::string(arc.Get(0), arc.GetSize(0)), std::ios::binary);
FileFormat ff(ss);
讀取二進制數據時,我使用了一個BinaryReader
類的功能,如這些:
BinaryReader::BinaryReader(std::istream &fs) : fs(fs) {
}
char* BinaryReader::ReadBytes(unsigned int n) {
char* buffer = new char[n];
fs.read(buffer, n);
return buffer;
}
unsigned int BinaryReader::ReadUInt32() {
unsigned int buffer;
fs.read((char*)&buffer, sizeof(unsigned int));
return buffer;
}
我喜歡這種方法的簡單,但我目前有很多內存兒的掙扎rors和SIGSEGVs,我擔心這是因爲這種方法。一個例子是當我在一個循環中重複創建和讀取一個檔案時。它適用於大量迭代,但過了一段時間,它開始讀取垃圾數據。
我對你的問題是,如果這種方法是可行的(在這種情況下,我問我做錯了什麼),如果不是,有什麼更好的方法嗎?
你沒有顯示存檔類的實現,我認爲用std :: ios :: binary打開istream? – Benj 2012-01-05 17:32:55
我在這裏寫的代碼中忘記了std :: ios :: binary,但它在我的版本中。 istream是從ifstream構建的,並且該流用std :: ios :: binary打開,如上所示。 – Merigrim 2012-01-05 18:22:32