programmez-en-d/redirection_flux.whata

103 lines
4.8 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[set
title = "Rediriger les flux d'entrée et de sortie standards"
partAs = chapitre
translator = "Raphaël Jakse"
proofreader = "Stéphane Goujet"
]
Tous les programmes que nous avons vu jusqu'à maintenant interagissaient à travers [c stdin] et [c stdout], respectivement le flux d''entrée standard et le flux de sortie standard. Par défaut, les fonctions d'entrée et de sortie comme [c readf] et [c writeln] opèrent sur ces flux.
Lors de l'utilisation de ces flux, nous avons supposé que l'entrée standard venait du clavier et que la sortie standard allait vers l'écran.
Nous commencerons à écrire des programmes qui géreront des fichiers dans le chapitre suivant. Nous verrons que comme les flux d'entrée et de sortie, les fichiers sont des flux de caractères également~ ; il sont donc utilisés pratiquement de la même manière que [c stdin] et [c stdout].
Avant de voir comment on accède aux fichiers depuis les programmes, je voudrais vous montrer comment les entrées et sorties standard des programmes peuvent être redirigés vers des fichiers ou vers d'autres programmes. Les programmes peuvent enregistrer dans des fichiers au lieu d'afficher à l'écran, et lire depuis des fichiers à la place du clavier. Même si ces fonctionnalités ne concernent pas directement les langages de programmation, ce sont des outils utiles qui sont disponibles dans toutes les consoles modernes.
[ = Rediriger la sortie standard vers un fichier avec [c > >].
Quand on lance un programme depuis la console, écrire un caractère [c > >] et un nom de fichier à la fin de la ligne de commande redirige la sortie standard de ce programme vers le fichier spécifié. Tout ce que le programme envoie vers la sortie standard sera écrit dans ce fichier plutôt que sur l'écran.
Testons ceci avec un programme qui lit un nombre flottant depuis son entrée, le multiplie par deux et l'affiche dans sa sortie standard~ :
[code=d <<<
import std.stdio;
void main()
{
double nombre;
readf(" %s", &nombre);
writeln(nombre * 2);
}
>>>]
Si le nom du programme est [c par_deux], sa sortie sera écrite vers un fichier nommé [c par_deux_resultat.txt] si on exécute la ligne suivante~ :
[code=bash <<<
./par_deux > par_deux_resultat.txt
>>>]
Par exemple, si on entre [c 1.2] dans la console, le résultat [c 2.4] apparaîtra dans [c par_deux_resultat.txt]. Note~ : même si le programme n'affiche pas une ligne du style «~ Veuillez entrer un nombre~ », il s'attend quand même à ce qu'un nombre soit entré.
]
[ = Rediriger l'entrée standard depuis un fichier avec [c <]
De manière similaire, l'entrée standard peut être redirigée depuis un fichier par [c <]. Dans ce cas, le programme lit depuis le fichier spécifié à la place du clavier.
Pour tester cela, utilisons un programme qui calcule le dixième d'un nombre~ :
[code=d <<<
import std.stdio;
void main()
{
double nombre;
readf(" %s", &nombre);
writeln(nombre / 10);
}
>>>]
En supposant que le ficheir [c par_deux_resultat.txt] existe toujours et contient [c 2.4], et que le nom du nouveau programme est [c un_dixieme], on peut rediriger l'entrée du nouveau programme de cette manière~ :
[code=bash <<<
./un_dixieme < par_deux_resultat.txt
>>>]
Cette fois, le programme lira depuis [c par_deux_resultat.txt] et affichera le résultat [c 0.24] à la console.
]
[ = Rediriger les deux flux standard
[c > >] et [c <] peuvent être utilisés en même temps :
[code=bash <<<
./un_dixieme < par_deux_resultat.txt > un_dixieme_resultat.txt
>>>]
Cette fois, l'entrée standard serait lue depuis [c par_deux_resultat.txt] et la sortie standard serait écrite vers [c un_dixieme_resultat.txt].
]
[ = Combiner les programmes avec [c > |]
Notez que [c par_deux_resultat.txt] est un intermédiaire entre les deux programmes~ ; [c par_deux] écrit dedans et [c un_dixieme] lit depuis ce fichier.
Le caractère [c > |] «~ achemine~ » (''pipe'') la sortie standard du programme qui est sur sa gauche vers l'entrée standard du programme qui est sur la droite sans nécessiter un fichier intermédiaire. Par exemple, quand les deux programmes ci-dessus sont «~ combinés~ » ensemble comme dans la ligne qui suit, ils calculent ensemble un cinquième du nombre en entrée~ :
[code=bash <<<
./par_deux | ./un_dixieme
>>>]
[c par_deux] est lancé et lit un nombre depuis l'entrée. Le résultat de [c par_deux] apparaît ensuite dans l'entrée standard de [c un_dixieme], qui à son tour calcule et affiche un dixième de ce résultat.
]
[ = Exercice
[
Combinez plus de deux programmes~ :
[code=bash <<< ./un | ./deux | ./trois >>>]
]
[[part:corrections/redirection_flux | … La solution]]
]