RleReader.cpp h - JulianKerignard/ProjetJeuDeLaVie_POO GitHub Wiki
#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
-
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.
-
-
-
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;
}
-
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'objetGrid
fourni. Le format RLE encode la grille en utilisant des caractères spéciaux pour représenter les cellules et leurs états.
- Cette méthode lit le fichier RLE spécifié par
-
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.
- Cette méthode lit le fichier RLE spécifié par
-
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.
-
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.
-
Initialisation de la Grille :
- Les coordonnées de départ pour centrer le motif dans la grille sont calculées.
-
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
).
- Les lignes de données (excluant les commentaires et les lignes vides) sont lues dans un flux de données (
-
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.
- Chaque caractère du flux de données est analysé :