문제

작은 모델 뷰어를 작성하고 DirectX 기능을 테스트하기 위해 게임지도/모델 파일의 내용을 프로그램으로 읽으려고합니다. 모델/맵 파일 형식은 본질적으로 청크되어 있으며 이러한 파일의 형식을 알고 있습니다. 다음과 같은 접근 방식을 사용하여 개별 청크를 통해 파싱하여 파일을 쉽게 읽을 수 있습니다.

class FileType1 {
    private Chunk1 c1;
    private Chunk2 c2; // etc

    public void Read(BinaryReader reader) {
        c1 = new Chunk1(reader);
        c2 = new Chunk2(reader);
    }
}

그러나 파일을 준수하여 파일이 적절한 구조인지 확인할 수 있도록 파일을 준수 하여이 파일을 일반적으로 읽을 수있는 방법을 생각하려고합니다 (예 : chunk1은 chunk2 등이 있습니다). 청크 슈퍼 클래스와 청크 공장을 사용하여 주어진 파일의 모든 청크를 일반적으로 읽을 수 있습니다. 본질적으로, 나는 이것과 유사한 방법을 초래하기 위해 구조 검증기 (또는 유사한 것)의 추가 기능으로 이것을 보강하고 싶습니다.

public void Read(BinaryReader reader, ChunkFileFormat format) {
    while (!EOF) {
        char[] chunkID = reader.ReadChars(4);
        Chunk c = chunkFactory.Create(chunkID);
        if (c.GetType() != format.Next.GetType())
            throw new Exception("File format is invalid");
        format.SetCurrentRecord(c);
    }
}

여기서 아이디어는 ChunkFileFormat 클래스가 파일의 구조를 지정하여 이진 스트림에서 다음으로 읽을 것으로 예상되는 청크 유형을 나타냅니다. 이를 통해 ChunkFileformat의 서브 클래스는 해당 형식의 레이아웃을 지정할 수 있으며 단일 읽기 방법은 각각의 긴 씨족과 반복적 인 메소드를 작성하지 않고 모든 다른 청크 파일 형식을 읽는 데 사용할 수 있습니다.

내 질문은,이 상황을 다룰 수있는 디자인 패턴이나 접근법을 알고 있습니까? C ++의 솔루션 (또는 그 문제에 대한 모든 언어)에 관심이 있지만 현재 진행중인 프로젝트는 C#입니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

이러한 종류의 규칙은 a를 사용하여 쉽게 코딩 할 수 있습니다 유한 상태 기계.

각 청크는 귀하가있는 상태를 변경해야합니다. 각 주에서는 각 상태가 특정 청크를 기다리고 있습니다. 현재에서 발생하지 말아야 할 청크를 만나면 오류입니다.

다른 팁

DataScript/antlr을 사용하여 형식에 대한 공식적인 설명을 작성하고 귀하를위한 구문 분석 및 I/O 코드를 생성 할 수 있습니다 (Java 또는 C ++).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top