Précédent Index Suivant

Entrées-sorties

Les fonctions d'entrées-sorties calculent une valeur (souvent de type unit), mais durant ce calcul elles effectuent une modification de l'état des périphériques d'entrées-sorties : modification du buffer du clavier, affichage à l'écran, écriture dans un fichier ou modification du pointeur de lecture. Les deux types suivants sont prédéfinis : in_channel et out_channel pour respectivement les canaux d'entrées et de sorties. Quand une fin de fichier est rencontrée l'exception End_of_file est déclenchée. Enfin, les trois constantes suivantes correspondent aux canaux standard d'entrée, de sortie et d'erreur à la manière d'Unix : stdin, stdout et stderr.

Canaux

Les fonctions d'entrées-sorties de la bibliothèque standard d'Objective CAML manipulent des canaux de communication : valeurs de types in_channel ou out_channel. En dehors des trois valeurs standard prédéfinies, la création d'un canal utilise une des fonctions suivantes :

# open_in;;
- : string -> in_channel = <fun>
# open_out;;
- : string -> out_channel = <fun>
open_in ouvre le fichier s'il existe2, déclenche l'exception Sys_error sinon.
open_out crée le fichier indiqué s'il n'existe pas ou l'écrase s'il existe.

# let ic = open_in "koala";;
val ic : in_channel = <abstr>
# let oc = open_out "koala";;
val oc : out_channel = <abstr>
Les fonctions de fermeture des canaux sont :

# close_in ;;
- : in_channel -> unit = <fun>
# close_out ;;
- : out_channel -> unit = <fun>


Lecture et écriture

Les fonctions les plus générales de lecture et d'écriture sont les suivantes :

# input_line ;;
- : in_channel -> string = <fun>
# input ;;
- : in_channel -> string -> int -> int -> int = <fun>
# output ;;
- : out_channel -> string -> int -> int -> unit = <fun>


Les fonctions suivantes lisent sur l'entrée standard ou écrivent sur la sortie standard :

# read_line ;;
- : unit -> string = <fun>
# print_string ;;
- : string -> unit = <fun>
# print_newline ;;
- : unit -> unit = <fun>


D'autres valeurs de type simple peuvent être aussi directement lues ou affichées. Ce sont les valeurs des types convertibles en chaînes de caractères.

Déclarations locales et ordre d'évaluation
Nous pouvons simuler une suite d'affichages des expressions de la forme let x = e1 in e2. Sachant que, en général, x est une variable locale susceptible d'être utilisée dans e2, nous savons que e1 est évaluée en premier et qu'ensuite vient le tour d'e2. Si les deux expressions sont des fonctions impératives dont le résultat est () mais qu'elles ont eu des effets de bord, nous les avons alors exécutées dans le bon ordre. En particulier puisque nous connaissons la valeur de retour de e1  : la constante () de type unit, on obtient une séquence d'affichage en écrivant la suite de déclarations par filtrage du motif ().

# let () = print_string "et un," in
let () = print_string " et deux," in
let () = print_string " et trois" in
print_string " zéro";;
et un, et deux, et trois zéro- : unit = ()


Exemple : C+/C-

L'exemple suivant implante le jeu << C'est plus/C'est moins >> qui consiste à cacher un nombre qu'un utilisateur devra trouver. Le programme indique à chaque réponse si le nombre caché est plus petit ou plus grand que le nombre proposé.

#  let rec cpcm n =
let () = print_string "taper un nombre : " in
let i = read_int ()
in
if i = n then
let () = print_string "BRAVO" in
let () = print_newline ()
in print_newline ()
else
let () =
if i < n then
let () = print_string "C+"
in print_newline ()
else
let () = print_string "C-"
in print_newline ()
in cpcm n ;;
val cpcm : int -> unit = <fun>


Voici un exemple de session :
# cpcm 64;;
taper un nombre : 88
C-
taper un nombre : 44
C+
taper un nombre : 64
BRAVO

- : unit = ()

Précédent Index Suivant