В моем текущем проекте у меня много бинарных файлов разных форматов. Некоторые из них действуют как простые архивы, и поэтому я пытаюсь найти хороший подход для передачи извлеченных файловых данных другим классам.
Вот упрощенный пример моего текущего подхода:
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();
};
Класс Archive в основном анализирует архив и считывает сохраненные файлы в char
указатели.
Чтобы загрузить первый FileFormat
файл из Archive
, я бы в настоящее время использовал следующий код:
* * 1010
(Обратите внимание, что некоторые файлы в архиве могут быть дополнительными архивами, но другого формата.)
При чтении двоичных данных я использую класс 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;
}
Мне нравится простота этого подхода, но в настоящее время я борюсь с большим количеством ошибок памяти и SIGSEGV, и я боюсь, что это из-за этого метода. Пример - когда я многократно создаю и читаю архив в цикле. Он работает большое количество итераций, но через некоторое время вместо этого начинает читать ненужные данные.
У меня к вам вопрос: возможен ли такой подход (в таком случае я спрашиваю, что я делаю неправильно), а если нет, какие существуют лучшие подходы?