TP 3 : flux

Préambule

Ce TP concerne la manipulation des fichiers d'une part, et l'utilisation des lignes de commandes d'autre part. Le paramétrage par la ligne de commande d'un exécutable, et la bonne gestion des entrées-sorties d'un programme sont deux points essentiels pour obtenir des exécutables qui seront utiles du point de vue des utilisateurs.

Exercice 1 : la commande cat

Le programme cat.c ouvre un fichier texte en lecture (soit le fichier standard d'entrée (stdin), soit un fichier dont le nom est donné en paramètre au programme) pour une lecture séquentielle des caractères. Chaque caractère lu est envoyé sur la sortie standard (stdout).

Compléter puis compiler le programme cat.c en un exécutable binaire cat.exe. Utiliser pour cela les fonctions fopen(), fgetc() et fclose(). Lancer et commenter les commandes suivantes :

% ./cat.exe cat.c
% cat cat.c | ./cat.exe
% echo hello | ./cat.exe
% ./cat.exe  < tp3.txt
% ./cat.exe

Exercice 2 : fichier texte et fichier binaire

  1. Ecrire un programme stats_txt.c qui calcule la moyenne et l'écart-type (rappel : racine carrée de la variance qui représente la moyenne des carrés des écarts à la moyenne) des nombres entiers positifs présents dans un fichier texte. Utiliser les fonctions : fopen(), fscanf() et fclose().
  2. Ecrire un programme txt2bin.c qui parcourt un fichier texte et insère tous les nombres entiers positifs présents dans la source texte vers un fichier binaire. Les noms de fichiers source et destination seront passés sur la ligne de commande. Vérifier le bon fonctionnement de votre programme en utilisant un éditeur de fichier binaire (par exemple hexdump). Comparer la taille du fichier physique et le nombre d'entiers contenus dans le fichier.
  3. Ecrire un programme stats_bin.c qui lit un fichier binaire d'entiers et calcule la moyenne et l'écart-type de tous les nombres de ce fichier (pour vérification).

Exercice 3 : lecture d'un fichier des couleurs et utilisation d'une bibliothèque

On souhaite écrire un programme pour lire le fichier des couleurs /etc/X11/rgb.txt et afficher dans une fenêtre graphique une partie de la palette disponible. Les premières lignes de ce fichier se présentent de la façon suivante :

! $Xorg: rgb.txt,v 1.3 2000/08/17 19:54:00 cpqbld Exp $
255 250 250       snow
248 248 255       ghost white
248 248 255       GhostWhite

On constate qu'à part la première ligne, chaque couleur est codée suivant le codage des couleurs RVB, à raison d'une couleur par ligne. On souhaite écrire un programme qui affichera une fenêtre graphique représentant le plus possible de couleurs (pour un maximum de 255 couleurs) dans des carrés régulièrement disposés.

Compléter le source rgb.c mis à disposition en répondant aux questions suivantes.

  1. Sauvegarder les fichiers utv_gd.h et utv_gd.c dans votre répertoire de travail puis produire le code machine binaire utv_gd.o en utilisant l'option de compilation -c du compilateur gcc. Ce module est indispensable à l'édition de liens du programme final.
  2. Ecrire une procédure qui compte le nombre de ligne du fichier rgb.txt et qui, à partir de ce nombre de ligne -1 (ce qui correspond au nombre de couleurs) noté C, retourne la taille d'un carré. A partir de la taille de l'image finale, on calculera la taille de chaque carré de couleur en remarquant qu'elle se déduit indirectement du calcul de la racine carrée de max(C, 255).
  3. Ecrire une procédure qui (re)lit (voir pour cela rewind()) le fichier rgb.txt ligne par ligne (voir getline() et fscanf()), ajoute chaque couleur à la table des couleurs (voir utv_gd_ajouter_couleur()) tant que le nombre de couleur n'a pas atteint la limite de 255 couleurs puis crée un carré de cette couleur (voir utv_gd_case_couleur()).