今まで、ファイルの文字列を読み込むのに一行ずつ(read_line)読んでいって、EOFの例外捕まえたらブレークみたいな処理を書いていて、多分間違ってるんだろうなあとか思いつつ放置していたのですが、やっぱり不味かったみたいで、調べたらちゃんとそれらしいのがありました。
in_channel_length でサイズとって、String.create でバッファ作って、really_input でコピーするってのが正しい作法っぽいですね。Buffer.create した上に、read_line の結果をadd_string とかバッファに追加するループまわしてたのは、何から何まで間違いだったのですね。
let read_text_file filepath = let ch = open_in filepath in let size = <font color="#FF0000">in_channel_length</font> ch in try let buff = String.create size in let () = <font color="#FF0000">really_input</font> ch buff 0 size in let () = close_in ch in buff with e -> let () = close_in ch in raise e
それと、たま〜に突如として小説の本文が全然表示されなくなったりとかしていたのは、この部分の処理で書くのも恥ずかしいバグを色々と仕込んでいたのが原因でした。まあ見つかってよかったです。
教訓
pervasives.mli はきちんと読もう。