2009-09-14 4 views
3

작은 모델 뷰어를 작성하고 일부 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 등이옵니다). 그러면 독자가 파일이 적절한 구조인지 확인할 수 있습니다. Chunk 수퍼 클래스와 Chunk 팩토리를 사용하여 주어진 파일에서 모든 청크를 일반적으로 읽을 수 있습니다. 기본적으로,이 방법과 유사한 방법을 초래할 수있는 구조 검사기 (또는 비슷한)의 추가 기능과 함께이 증대하고 싶습니다 :

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#입니다.

미리 감사드립니다.

답변

2

이러한 종류의 규칙은 finite-state machine을 사용하여 쉽게 코딩됩니다.

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

+0

고마워요, 그게 아마도 내가 지금 찾고있는 솔루션입니다. :-) 올바른 방향으로 나를 가리켜 주셔서 감사합니다. –

0

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

+0

감사합니다. 나는 그것에 대해 살펴볼 것이지만, 그것이 내가 뭘하고 있는지 확실히 모르겠다. –

관련 문제