Domanda

Sto cercando di leggere i contenuti dei file di mappe / modelli di un gioco in un programma allo scopo di scrivere un visualizzatore di modelli di piccole dimensioni e testare alcune funzionalità di DirectX. I formati di file modello / mappa sono di natura troncata e conosco il formato di questi file. Posso facilmente leggere i file analizzando i singoli blocchi, usando un approccio come questo:

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

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

Tuttavia, sto cercando di pensare a un modo per leggere genericamente questi file, specificando il formato a cui aderisce il file (ovvero Chunk1 è seguito da Chunk2 ecc. ecc.) in modo che il lettore possa assicurarsi che il file abbia una struttura appropriata . Posso usare una super classe Chunk e una factory Chunk per leggere genericamente tutti i blocchi in un dato file. In sostanza, vorrei aumentare questo con la funzionalità aggiuntiva di un validatore di strutture (o qualcosa di simile) per ottenere un metodo simile a questo:

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

L'idea qui è che la classe ChunkFileFormat specifica la struttura del file, indicando quale tipo di blocco dovrebbe essere la prossima lettura dal flusso binario. Ciò consentirebbe alle sottoclassi di ChunkFileFormat di specificare il layout di quel particolare formato e il singolo metodo di lettura potrebbe essere utilizzato per leggere tutti i diversi formati di file suddivisi, piuttosto che scrivere un metodo prolisso e ripetitivo per ciascuno.

La mia domanda è: qualcuno è a conoscenza di modelli di progettazione o approcci che potrebbero affrontare questa situazione? Il progetto a cui sto lavorando è attualmente in C # anche se sarei interessato a soluzioni in C ++ (o in qualsiasi altra lingua).

Grazie in anticipo!

È stato utile?

Soluzione

Questo tipo di regole può essere facilmente codificato utilizzando una macchina a stati finiti .

Ogni blocco dovrebbe cambiare lo stato in cui ti trovi. Ogni stato in attesa di blocchi specifici in seguito. Se incontri un pezzo che non dovresti incontrare nella corrente, questo è un errore.

Altri suggerimenti

È possibile creare una descrizione formale del formato utilizzando DataScript / antlr e fare in modo che crei codice di analisi e I / O (Java o C ++).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top