RleReader.cpp h - JulianKerignard/ProjetJeuDeLaVie_POO GitHub Wiki

Fichier RLEReader.h

#ifndef RLE_READER_H
#define RLE_READER_H

#include "Grid.h"
#include <string>

// Classe de gestion des fichiers RLE (Run Length Encoded) pour le Jeu de la Vie
class RLEReader {
public:
    // Charge une grille à partir d'un fichier RLE et retourne une nouvelle grille
    static Grid loadFromFile(const std::string& filename);
    
    // Charge une grille à partir d'un fichier RLE et met à jour une grille existante
    static void loadFromFile(const std::string& filename, Grid& grid);
};

#endif // RLE_READER_H

Documentation des Membres

  • Classe RLEReader :
    • Gère la lecture des fichiers RLE (Run Length Encoded) pour le Jeu de la Vie.

    • Membres publics :

      • static Grid loadFromFile(const std::string& filename) :
        • Charge une grille à partir d'un fichier RLE et retourne une nouvelle grille.
      • static void loadFromFile(const std::string& filename, Grid& grid) :
        • Charge une grille à partir d'un fichier RLE et met à jour une grille existante.

Fichier RLEReader.cpp

Implémentation de la Classe RLEReader

Méthodes

  • void loadFromFile(const std::string& filename, Grid& grid) :
    • Charge une grille à partir d'un fichier RLE et met à jour une grille existante.
void RLEReader::loadFromFile(const std::string& filename, Grid& grid) {
    std::ifstream file(filename);
    if (!file.is_open()) {
        throw std::runtime_error("Cannot open RLE file: " + filename);
    }

    int patternWidth = 0, patternHeight = 0;
    std::string line;
    while (std::getline(file, line)) {
        if (line.empty() || line[0] == '#') continue;
        if (line[0] == 'x') {
            std::regex header_regex("x\\s*=\\s*(\\d+)\\s*,\\s*y\\s*=\\s*(\\d+)");
            std::smatch matches;
            if (std::regex_search(line, matches, header_regex)) {
                patternWidth = std::stoi(matches[1]);
                patternHeight = std::stoi(matches[2]);
                std::cout << "Pattern width: " << patternWidth << ", height: " << patternHeight << "\n"; // Debug
            }
            break;
        }
    }

    int startX = (grid.getWidth() - patternWidth) / 2;
    int startY = (grid.getHeight() - patternHeight) / 2;

    std::stringstream dataStream;
    while (std::getline(file, line)) {
        if (line.empty() || line[0] == '#' || line[0] == 'x') continue;
        dataStream << line;
    }

    int x = startX, y = startY;
    std::string count;

    for (char c : dataStream.str()) {
        if (std::isdigit(c)) {
            count += c;
            continue;
        }

        int repeat = count.empty() ? 1 : std::stoi(count);
        count.clear();

        switch (c) {
            case 'o':
                for (int i = 0; i < repeat; ++i) {
                    if (x >= 0 && x < grid.getWidth() && y >= 0 && y < grid.getHeight()) {
                        grid.setCellAt(x, y, CellState::ALIVE);
                        std::cout << "Setting cell (" << x << ", " << y << ") to ALIVE\n"; // Debug
                    }
                    x++;
                }
                break;
            case 'b':
                x += repeat;
                break;
            case '$':
                y += repeat;
                x = startX;
                break;
            case '!':
                return;
            default:
                throw std::runtime_error("Unexpected character in RLE file: " + std::string(1, c));
        }
    }
}
  • Grid loadFromFile(const std::string& filename) :
    • Charge une grille à partir d'un fichier RLE et retourne une nouvelle grille.
Grid RLEReader::loadFromFile(const std::string& filename) {
    Grid grid(10, 10);
    loadFromFile(filename, grid);
    return grid;
}

Explications

  • void loadFromFile(const std::string& filename, Grid& grid) :

    • Cette méthode lit le fichier RLE spécifié par filename, analyse son contenu, et met à jour l'objet Grid fourni. Le format RLE encode la grille en utilisant des caractères spéciaux pour représenter les cellules et leurs états.
  • Grid loadFromFile(const std::string& filename) :

    • Cette méthode lit le fichier RLE spécifié par filename, crée une nouvelle grille, et la retourne. Elle appelle la méthode précédente pour remplir la grille avec les données du fichier.

Processus de Lecture

  1. Ouverture du Fichier :

    • La méthode tente d'ouvrir le fichier spécifié.
    • Si le fichier ne peut pas être ouvert, une exception est lancée.
  2. Lecture de l'En-tête :

    • La méthode lit les lignes du fichier jusqu'à trouver l'en-tête qui définit les dimensions du motif.
    • Un expression régulière (regex) est utilisée pour extraire les dimensions.
  3. Initialisation de la Grille :

    • Les coordonnées de départ pour centrer le motif dans la grille sont calculées.
  4. Lecture des Données RLE :

    • Les lignes de données (excluant les commentaires et les lignes vides) sont lues dans un flux de données (stringstream).
  5. Décodage des Données RLE :

    • Chaque caractère du flux de données est analysé :
      • Les chiffres indiquent le nombre de répétitions.
      • o représente une cellule vivante.
      • b représente une cellule morte.
      • $ indique le passage à la ligne suivante.
      • ! marque la fin du motif.
⚠️ **GitHub.com Fallback** ⚠️