練習問題 8.11

ファイル名を引数にとって、そのファイルの内容を行番号付きで表示させる関数 display_file を定義しなさい。

予備知識

ファイルは、チャンネルに結び付けられる。そのチャンネルを oc とする。

let oc = open_in "ex8-11.txt";;

チャンネルから1行読み込む

input_line oc;;

解答

let display_file filename =
  let oc = open_in filename
  and line = ref 1
  and s = ref "a"
  and jo = ref true in
  while (!jo == true) do
      try
          s := input_line oc;
          print_int !line;
          print_string " ";
          print_endline !s;
          line := !line + 1
      with End_of_file -> jo := false
  done;
  close_in oc
;;

付け足し

上記リストの中で、

print_int !line;

とあるのを

Printf.printf "%4d" !line;

とすると、以下のように、行番号を4桁右揃えで出力することができる。

# display_file "ex8-11.ml";;
   1 (* プログラミング in OCaml 練習問題 8.11 *)
   2
   3 (* 練習問題 8.11 *)                                                             
   4 
   5 (*
   6 ファイル名を引数にとって、そのファイルの内容を行番号付きで表示させる関数 display_file を定義しなさい。
   7  *)
   8 
   9 (* 予備知識
  10  * ファイルは、チャンネルに結び付けられる。そのチャンネルを oc とする。
  11 let oc = open_in "ex8-11.txt";;
  12 *)
  13 
  14 (* チャンネルから1行読み込む
  15 input_line oc;;
  16 *)

変換指定子は、”%4u” のほうがいいのかなあ。
d — 符号付き十進数
u — 符号なし十進数

参考

Module Printf