현재 프로젝트에서 다른 형식의 많은 이진 파일을 가지고 있습니다. 그 중 일부는 간단한 아카이브로 작동하므로 추출 된 파일 데이터를 다른 클래스로 전달하는 좋은 방법을 생각해 내려고합니다.파일 분할 및 다른 클래스에 데이터 전달
여기에 내 현재의 접근 방식의 간단한 예입니다 :
는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(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;
}
나는이 방법의 단순성을 좋아하지만 나는 현재 메모리 어의 많은 어려움을 겪고있어 : 이진 데이터를 읽을 때
, 나는 다음과 같은 기능을 가진 BinaryReader
클래스를 사용 rors와 SIGSEGVs 그리고 나는이 방법 때문에 그것이 두렵다. 예를 들어 루프에서 반복적으로 아카이브를 만들고 읽는 경우를 예로들 수 있습니다. 많은 수의 반복 작업을 처리하지만 잠시 후 정크 데이터 읽기를 시작합니다.
이 접근법이 가능한 경우 (내 경우 내가 잘못한 것을 묻습니다), 그렇지 않은 경우 더 나은 접근 방법이 있습니까?
당신은 Archive 클래스의 구현을 보여주지 않았기 때문에 std :: ios :: binary로 istream을 여는 것으로 추정 할 수 있습니까? – Benj
나는 여기서 작성한 코드에서 std :: ios :: binary라는 것을 잊어 버렸지 만, 나의 버전에는 거기에있다. istream은 ifstream에서 생성되며 스트림은 위에 표시된 것처럼 std :: ios :: binary로 열립니다. – Merigrim