:: Enseignements :: ESIPE :: E3INFO :: 2011-2012 :: Programmation C ::
[LOGO]

Presque prêts pour la programmation système...


Exercice 1 - Ça va couper chérie...

Vous devez coder une mini-version du programme cut. Vous ne gèrerez (avec getopt) que les options -d et -f, et pour -f, vous ne prendrez en compte que les listes de numéros de champ séparés par des virgules. MAIS, contrairement au vrai cut, vous considérerez les suites de séparateurs comme un seul séparateur, de façon à ce qu'on puisse, par exemple, extraire correctement avec votre programme les informations données par la commande ls -l. De plus, si aucun nom de fichier n'est donné en argument, le programme lira depuis l'entrée standard. Dernière différence, votre version écrira les champs sélectionnés non pas dans l'ordre d'entrée comme le fait le vrai cut, mais selon l'ordre dans lequel ils auront spécifiés avec l'option -f.

Afin de vous aider dans cette tâche, voici quelques suggestions:
  • pensez à sscanf pour parser l'argument de l'option -f, et stockez les numéros lus dans une liste chaînée d'entiers.
  • écrivez une fonction qui lit une ligne jusqu'à un \n ou la fin de fichier, et qui stocke les caractères lus (sauf le \n final) dans un tableau alloué dynamiquement et réalloué si nécessaire. La fonction renverra NULL en fin de fichier.
  • pour chaque ligne, parcourez la chaîne lue en remplaçant les occurrences du caractère séparateur par des \0. Dans le même temps, créez un tableau de char* alloué dynamiquement dans lequel vous stockerez le début de chaque champ. Ainsi, si la chaîne lue est Il fait beau et que le séparateur est l'espace, la case t[0] pointera sur le début de la chaîne, la case t[1] pointera sur la case contenant le caractère f et la case t[2] pointera sur la case contenant le caractère b. Il faudra veiller à réallouer ce tableau si nécessaire et à retourner sa taille.
  • une fois ce découpage effectué, il ne restera plus qu'à parcourir la liste contenant les numéros des champs voulus et à les afficher, s'ils existent, avant de libérer toute la mémoire utilisée.