Pergunta

Eu estou tentando ler o conteúdo de arquivos de mapa / modelo de um jogo em um programa para efeitos de escrever um pequeno visualizador de modelo e testar alguns DirectX apresenta. Os formatos de arquivo de modelo / mapa são blocos na natureza, e eu sei o formato desses arquivos. Eu posso facilmente ler os arquivos por analisar através dos pedaços individuais, usando uma abordagem como esta:

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

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

No entanto, eu estou tentando pensar em alguma maneira de ler genericamente esses arquivos, especificando o formato dos adere arquivo para (ie Chunk1 é seguido por Chunk2 etc etc) para que o leitor pode garantir que o arquivo é de uma estrutura adequada . Posso usar uma classe Chunk super e uma fábrica Chunk para ler genericamente todos os pedaços em um determinado arquivo. Essencialmente, eu gostaria de aumentar isso com a funcionalidade adicional de um validador de estrutura (ou algo similar) para resultar em um método semelhante a este:

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);
    }
}

A idéia aqui é que a classe ChunkFileFormat especifica a estrutura do arquivo, indicando o que se espera tipo pedaço para ser o próximo lidos do fluxo binário. Isso permitiria que subclasses de ChunkFileFormat para especificar o layout do que o formato particular, eo método de leitura única poderia ser usado para a leitura de todos os formatos de arquivo em partes diferentes, ao invés de escrever um método prolixo e repetitivo para cada um.

A minha pergunta é, é alguém consciente de padrões de projeto ou abordagens que poderiam lidar com esta situação? O projeto que estou trabalhando atualmente em C #, embora eu estaria interessado em soluções em C ++ (ou qualquer linguagem para que o assunto).

Agradecemos antecipadamente!

Foi útil?

Solução

Este tipo de regras são facilmente codificado usando um de estado finito máquina .

Cada pedaço deve alterar o estado em que está. Cada estado à espera de pedaços específicos depois. Se você encontrar um pedaço que você não deve encontrar na atual, isso é um erro.

Outras dicas

Você pode criar uma descrição formal do formato usando DataScript / antlr e tê-lo criar análise e i / o código para você (Java ou C ++).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top