TD 4: entrées/sorties

Tristan Crolard - François Pottier

Résumé:

fopen, fprintf, fputc, fgetc, feof, ferror, fclose (C standard); getopt, optind (POSIX.2).

La plupart des commandes UNIX se comportent par défaut comme des filtres (ces commandes lisent sur leur entrée standard et écrivent sur leur sortie standard). Ces commandes peuvent être composées grâce aux tubes (notés | en shell). L'élément neutre de cette composition est la commande cat que nous nous proposons de réécrire ici en utilisant les fonctions d'entrée-sortie de la librairie standard. Cette commande peut aussi recevoir un ou plusieurs noms de fichiers en paramètres: ce sont ces fichiers (et non plus l'entrée standard) qui sont alors copiés séquentiellement sur la sortie standard.

1.
Écrire une fonction catfile, dont le prototype sera le suivant:
void catfile (FILE *stream);
Cette fonction copiera le flot donné en paramètre (supposé ouvert en lecture) sur sa sortie standard. Toute erreur d'écriture sera considérée comme fatale. Une erreur de lecture provoquera uniquement le retour de la fonction.

2.
Écrire la fonction main, dont le prototype (en C standard) doit être:
int main (int argc, char *argv[]);
Si aucun argument n'est fourni sur la ligne de commandes, cette fonction copiera son entrée standard sur sa sortie standard. Sinon, les fichiers nommés sur la ligne de commandes seront copiés. Une erreur d'ouverture, de lecture ou de fermeture de l'un de ces fichiers provoquera l'écriture d'un message approprié sur stderr, mais ne sera pas fatale.

3.
Modifier la fonction catfile de manière à ce qu'elle puisse numéroter les lignes en sortie (en commençant à 1) si la variable globale booléenne num_flag est vraie.

4.
Écrire une fonction usage, de prototype
void usage (void);
qui affiche le bon usage de votre commande (liste des options et des paramètres possibles) et termine.

5.
Modifier la fonction main afin d'analyser les options de la ligne de commande: la seule option acceptée sera -n, qui forcera la numérotation des lignes en positionnant num_flag à vrai. Si toute autre option est fournie, la fonction usage sera appelée. On utilisera pour cela la fonction POSIX.2 getopt, dont l'en-tête est
int getopt (int argc, char * const argv[], const char *optstring);
ainsi que la variable externe POSIX.2 optind (cf. le manuel en ligne).



Jean-Baptiste Yunes
1999-02-05