Spécifications - Partie 2

Gestion dynamique des joueurs et persistance des données
Objectifs
  • Remplacer le tableau statique par un tableau dynamique alloué avec malloc/realloc
  • Implémenter le chargement et la sauvegarde des joueurs depuis/vers un fichier texte
  • Vérifier la cohérence des modifications apportées avec les fonctionnalités précédentes
  • Créer un menu interactif pour tester toutes les fonctionnalités (optionnel)
Ressources
  • Cours sur l’allocation dynamique (malloc, realloc, free)
  • Documentation sur la gestion des fichiers en C (fopen, fclose, fprintf, fscanf)
  • Documentation sur les pointeurs de pointeurs
Livrables attendus avant la séance 3

Fichier à compléter :

src/
├── main.c            # Optionnel : menu interactif
└── array-utils.c     # À compléter : fonctions de manipulation du tableau dynamique

1 Contexte

Dans la Partie 1, vous avez utilisé un tableau statique avec une taille fixe (MAX_PLAYERS). Cette approche a des limites :

  • Gaspillage de mémoire si on utilise peu de joueurs
  • Impossible d’ajouter plus de joueurs que la capacité maximale

Dans cette partie, vous allez :

  1. Créer un tableau dynamique de taille fixe alloué avec malloc
  2. Implémenter le chargement et la sauvegarde des joueurs depuis/vers un fichier texte
  3. Créer un menu interactif pour tester toutes les fonctionnalités (optionnel)

2 Fonctions à implémenter

2.1 Création d’un tableau dynamique

Player** createPlayerArray(int size);

Description :
Crée et initialise un tableau dynamique de size pointeurs vers Player où tous les éléments sont initialisés à NULL. Retourne un pointeur vers le tableau alloué ou NULL en cas d’échec.


2.2 Destruction du tableau dynamique

void destroyPlayerArray(Player** players, int size);

Description :
Libère toute la mémoire allouée pour chaque joueur players[i] du tableau players puis le tableau players lui-même.


2.3 Chargement des joueurs depuis un fichier

Player** loadPlayers(const char* filename, int* numPlayers);

Description :
Charge les joueurs depuis un fichier texte dont le chemin est indiqué par filename. Crée et renvoie un tableau dynamiquement alloué en fonction du nombre de joueurs lu dans le fichier. La fonction renvoie NULL en cas d’erreur.

Format du fichier :

3
ForkMaster 10 1200 5 3 2 0
SpoonyKnight 5 800 2 1 1 0
KnifeLord 15 1500 10 8 2 0
Gestion d’erreur
  • Si fopen() échoue, afficher un message d’erreur et retourner NULL
  • Si createPlayerArray() échoue, fermer le fichier et retourner NULL
  • Si createPlayer() échoue pour un joueur, libérer tout ce qui a été alloué avec destroyPlayerArray(), fermer le fichier et retourner NULL
Où sont stockés les fichiers de données ?

Les fichiers de données sont stockés dans le répertoire input/ à la racine du projet.


2.4 Sauvegarde des joueurs dans un fichier

void savePlayers(const char* filename, Player** players, int size);

Description :
Sauvegarde tous les joueurs du tableau players de taille size dans un fichier texte dont le chemin est indiqué par filename. Le format doit être le même que celui utilisé pour le chargement.

Indications
  • N’oubliez pas le caractère de fin de ligne \n après le nombre de joueurs
  • Vérifiez que players[i] n’est pas NULL avant d’accéder à ses champs
  • Pensez à fermer le fichier après écriture
  • La fonction ne retourne rien (void), mais affiche un message d’erreur si l’ouverture échoue

3 Vérification de la cohérence avec les fonctionnalités précédentes

Afin de s’assurer que les modifications apportées pour utiliser un tableau dynamique n’ont pas introduit de régressions, il est important de vérifier la cohérence des fonctionnalités précédemment implémentées.

  1. Ajout de joueurs : Vérifiez que la fonction addPlayer fonctionne correctement avec le tableau dynamique. Assurez-vous que les joueurs sont ajoutés correctement et que la taille du tableau est mise à jour si nécessaire.
  2. Suppression de joueurs : Testez la fonction removePlayer pour vous assurer qu’elle supprime correctement les joueurs du tableau dynamique et libère la mémoire associée.
  3. Recherche de joueurs : Vérifiez que la fonction searchPlayerByUsername fonctionne comme prévu avec le tableau dynamique.
  4. Tri des joueurs : Assurez-vous que la fonction sortPlayersBySpicyIndex trie correctement les joueurs dans le tableau dynamique.
  5. Affichage des joueurs : Testez la fonction displayAllPlayers pour vérifier qu’elle affiche correctement les informations des joueurs dans le tableau dynamique.