Le standard du C (inspiré par l'environnement Unix) impose l'existence de trois flux prédéfinis : stdin, stdout, et stderr. Ces flux sont des variables globales de type FILE* et correspondent respectivement à l'entrée standard, la sortie standard, et la sortie sur erreur du programme.
Il est inutile d'ouvrir ces flux par fopen, et il est interdit de les fermer par fclose. Ces flux devraient être limités à faire transiter des caractères (dont l'encodage est fixé par l'environnement). En conséquence, les tampons de ces flux sont automatiquement configurés en mode « ligne ». Entre autres, cela signifie que le tampon d'écriture est vidangé dès qu'il contient une ligne entière (terminée par un '\n').
Le format d'un fichier peut identifier certaines de ses parties comme du texte. Pour lire ces parties, on peut utiliser fread ou se reposer sur des fonctions dédiées.
La fonction fgets a pour prototype :
char *fgets(char *zone, int capacite, FILE *flux);
Le premier argument est l'adresse de la zone mémoire qui va recevoir les données. Le deuxième est la capacité de cette zone. Le troisième est le flux de lecture. Cette fonction va copier jusqu'à capacite-1 caractères, à moins qu'il ne rencontre la fin du fichier ou un saut de ligne. Le saut de ligne sera également transféré. Un marqueur de fin de chaîne sera ensuite ajouté.
La valeur renvoyée est l'adresse de la zone, ou NULL s'il y a eu une erreur ou si la fin du fichier est intervenue avant la lecture du moindre caractère.
La fonction fscanf a pour prototype :
int fscanf(FILE *flux, const char *format, ...);
Elle fonctionne sur le même principe que scanf, mais en ajoutant un paramètre pour indiquer depuis quel flux lire.
La valeur de retour est le nombre de valeurs interprétées, ou EOF en cas d'erreur ou si la fin du fichier est atteinte avant la moindre lecture. La constante EOF est obligatoirement négative (elle vaut -1 dans sa version GNU).
Pour écrire du texte dans un fichier, il est possible d'utiliser fwrite, mais des fonctions plus spécialisées existent.
La fonction fputs a pour prototype :
int fputs(const char *chaine, FILE *flux);
Le premier argument est l'adresse de la chaîne à écrire. Le deuxième est le flux d'écriture. Cette fonction va copier tous les caractères de la chaîne (jusqu'au marqueur de fin de chaîne exclu) dans le flux de sortie.
La valeur de retour est positive ou nulle en cas de succès, et EOF en cas d'erreur.
La fonction fprintf a pour prototype :
int fprintf(FILE *flux, const char *format, ...);
Elle fonctionne sur le même principe que printf, mais en ajoutant un paramètre pour indiquer vers quel flux écrire.
La valeur de retour est positive ou nulle en cas de succès, et EOF en cas d'erreur.
Numérotation. Écrivez un programme qui lit un fichier contenant uniquement du texte dont le nom et le chemin seront donnés en argument sur la ligne de commande puis affiche le contenu du fichier sur sa sortie standard en numérotant chaque ligne.
Pour les esthètes, faites en sorte d'afficher les numéros dans une couleur différente (en utilisant un code d'échappement).
Tableur. Un fichier au format CSV sert à décrire un tableau de valeurs à deux dimensions. Les valeurs sont séparées par des virgules (ou parfois des points-virgule en configuration française) et forment ainsi des lignes. Les lignes sont bien sûr séparées par des sauts de ligne.
Reprenez le programme du premier exercice sur les
tableaux multidimensionnels et sauvegardez les
tableaux dans des fichiers nommés t1.csv
, t2.csv
, et
t3.csv
. Si vous respectez bien le format, vous devriez pouvoir ouvrir ces
fichiers à l'aide d'un tableur.
Dénomination. Le fichier rgb.txt
est
parfois utilisé pour représenter les correspondances entre les noms des couleurs et leurs
composantes RVB. Écrivez un programme qui prend sur la ligne de commande trois
composantes et qui affiche tous les noms qui correspondent.
Décomposition. Sur le même principe que l'exercice précédent, écrivez un programme qui prend un nom de couleur sur la ligne de commande et qui affiche les composantes correspondantes (si elles sont dans le fichier).
Gomoku. Écrivez un programme permettant à deux joueurs de s'affronter au Gomoku. Le programme devra demander à un joueur où il souhaite placer sa pierre, puis il affichera le tablier mis à jour. Il passera ensuite à l'autre joueur, et ainsi de suite jusqu'à ce que le tablier soit rempli (ce qui donne un match nul).
Pour simplifier l'exercice, on ne contrôlera pas la légalité des coups et on ne testera pas les conditions de victoire. Par contre, les joueurs auront l'option d'interrompre la partie et de la sauvegarder pour plus tard. Le fichier de sauvegarde devra utiliser un format texte permettant de facilement visualiser l'état de la partie.