Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Comment_rediriger_les_entrées/sorties_ standards ?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: [Caml-list] Re: [Caml-list]_Comment_rediriger_les_entrées/sorties __standards_?
[English summary: redirecting standard output to a file from a
 Caml program; Unix file descriptor hacking.]

> Je voudrait rediriger les entrées/sorties standards. Je croyais pouvoir le 
> faire en tapant :
> let std_out = open_out "c:\projet\entree"
> mais  l'écriture se fait toujours à l'écran.

Vous pouvez facilement rediriger la sortie du formatteur (module
Format, la chose qui imprime joliment les sorties du toplevel en
particulier) à l'aide de Format.set_formatter_out_channel.

Pour rediriger toutes les sorties faites sur stdout, il faut se
plonger dans les arcanes du module Unix:

  let oc = 
    Unix.openfile "/tmp/myfile"
                  [Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC] 0o666 in
  flush stdout;
  Unix.dup2 oc Unix.stdout;
  Unix.close oc

Après exécution du code ci-dessus, toutes les sorties sur stdout
(et même celles sur Unix.stdout) iront dans le fichier /tmp/myfile.
Attention, ceci n'est pas réversible.  Si plus tard vous voulez
annuler la redirection, il faut faire un peu plus compliqué:

  let saved_stdout = Unix.dup Unix.stdout in
  let oc = 
    Unix.openfile "/tmp/myfile"
                  [Unix.O_WRONLY; Unix.O_CREAT; Unix.O_TRUNC] 0o666 in
  flush stdout;
  Unix.dup2 oc Unix.stdout;
  Unix.close oc;
  (* ici toutes les sorties sur stdout vont dans le fichier *)
  flush stdout;
  Unix.dup2 saved_stdout Unix.stdout;
  Unix.close saved_stdout;
  (* ici on est revenu à l'état initial *)

Ces exemples sont pour Objective Caml, mais je crois que l'on peut
faire la même chose en Caml Light, mutando mutandis.

- Xavier Leroy
-------------------
To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr