open_out を使ってファイルを開くと,そのファイルがすでに存在した場合,中身を消去してしまう。既存のファイルに追加するには,open_out_gen を使ってチャネルを作る*1。
# let outfile = open_out_gen [Open_wronly; Open_append; Open_text] 0o666 "C:/home/takatoh/foo.txt";; val outfile : out_channel = <abstr>
第1引数は open_flag といって,ファイルを開くときのオプション。上で設定してるのはライトオンリー,追加,テキストファイル,というところだろう。第2引数はファイルのパーミッション,第3引数はファイル名。で,かえってくるのは open_out と同じ出力用のチャネル(out_channel)。
# output_string outfile "foo\n";; - : unit = () # output_string outfile "bar\n";; - : unit = () # close_out outfile;; - : unit = () # open_out_gen;; - : open_flag list -> int -> string -> out_channel = <fun>
foo.txt はこうなる。
^o^ >type foo.txt Hello, world. foo bar
ちゃんと追加になっている。
open_flag はヴァリアントで,The Objective Caml system release 3.10の19.2 Module Pervasives: the initially opened module の General output functionsの項によると:
type open_flag = | Open_rdonly (* open for reading. *) | Open_wronly (* open for writing. *) | Open_append (* open for appending: always write at end of file. *) | Open_creat (* create the file if it does not exist. *) | Open_trunc (* empty the file if it already exists. *) | Open_excl (* fail if Open_creat and the file already exists. *) | Open_binary (* open in binary mode (no conversion). *) | Open_text (* open in text mode (may perform conversions). *) | Open_nonblock (* open in non-blocking mode. *)
*1:ここ,「プログラム in OCaml」に誤植あり。○ Open_wronly,× Open_wonly