test.ml:

let () = begin
  Scanf.scanf " %d %d " @@ Printf.printf "scanf : (%d, %d)\n";
  for i = 1 to 2 do
    print_string "read_line : ";
    print_endline @@ read_line ()
  done
end

input.txt:

12 34
hello world
this is a test

として、cat input.txt | ocaml test.ml とすると、

scanf : (12, 34)
read_line : Fatal error: exception End_of_file

となり、read_lineが例外を投げてしまいます(本当は

scanf : (12, 34)
read_line : hello world
read_line : this is a test

となって欲しいです)。

毎行read_lineしてsscanfを使えば期待する動作にできるのは分かるのですが、何故こうなるのかが分かりません。また、単にscanfread_lineを併用できるのであればその方法も教えて頂けると有難いです。