Question

J'essaie de lire le contenu des fichiers de carte / modèle d'un jeu dans un programme afin d'écrire un petit afficheur de modèle et de tester certaines fonctionnalités de DirectX. Les formats de fichier modèle / carte sont de nature volumineuse, et je connais le format de ces fichiers. Je peux facilement lire les fichiers en analysant les différents morceaux, en utilisant une approche comme celle-ci:

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

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

Cependant, j'essaie de trouver un moyen de lire ces fichiers de manière générique, en spécifiant le format auquel le fichier adhère (c.-à-d. Chunk1 est suivi de Chunk2, etc.) afin que le lecteur puisse s'assurer que le fichier est correctement structuré. . Je peux utiliser une super classe de morceaux et une fabrique de morceaux pour lire de manière générique tous les morceaux d'un fichier donné. Pour l’essentiel, je souhaiterais y ajouter les fonctionnalités supplémentaires d’un validateur de structure (ou quelque chose de similaire) afin d’obtenir une méthode similaire à celle-ci:

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'idée ici est que la classe ChunkFileFormat spécifie la structure du fichier, indiquant quel type de bloc devrait être la prochaine lecture du flux binaire. Cela permettrait aux sous-classes de ChunkFileFormat de spécifier la présentation de ce format particulier, et la méthode de lecture unique pourrait être utilisée pour lire tous les formats de fichiers fragmentés différents, au lieu d'écrire une méthode longue et répétitive pour chacun.

Ma question est la suivante: quelqu'un est-il au courant des modèles de conception ou des approches susceptibles de faire face à cette situation? Le projet sur lequel je travaille est actuellement en C # bien que des solutions en C ++ (ou n'importe quel langage) m'intéresseraient.

Merci d'avance!

Était-ce utile?

La solution

Ce type de règles est facilement codé à l'aide d'une machine à états finis .

Chaque morceau devrait changer l'état dans lequel vous vous trouvez. Chaque état attend des morceaux spécifiques après. Si vous rencontrez un morceau que vous ne devriez pas rencontrer dans le courant, c'est une erreur.

Autres conseils

Vous pouvez créer une description formelle du format à l'aide de DataScript / antlr et lui demander de créer un code d'analyse et d'E / S (Java ou C ++).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top