1

ファイル IO に関するいくつかの質問を投稿しました。自分のニーズに適したものを見つけようとしているだけです。割り当てを見つけてグーグルで検索したので、最終的なファイル IO の質問は次のとおりだと思います (ここにいくつかの疑似コードが表示されます)。

let ic = open_in "myfile.txt" in
try
  while true do
    let line = input_line ic in
    line += "\n" + line
  done
with End_of_file -> close_in ic;

print_endline line;;

String.concat "\n" (line; line) を試してみましたが、明らかに無効ですが、この状況で String.concat メソッドをどのように使用するかはわかりません。

4

1 に答える 1

4

この状況では、文字列の連結は不適切です。これstr1 ^ str2は、サイズの合計に比例して時間とメモリがかかるためです。したがって、連結の反復は 2 次動作を示します。これは避けたいと考えています。

あなたの問題にはいくつかの解決策があります:

  1. 文字列を蓄積するように正確に設計されたBufferモジュールを使用する
  2. 行のリストに行を集め、最後に効率的なString.concat : string -> string list -> string関数 ( documentation ) を使用してそれらを一度に連結します。
  3. それを行う既存のライブラリを使用します。たとえば、バッテリーには、入力チャネルのコンテンツ全体をファイルに取得するためのinput_all関数があります。

.

let read_file file =
  let ic = open_in file in
  let buf = Buffer.create (in_channel_length ic) in
  try
    while true do
      let line = input_line ic in
      Buffer.add_string buf line;
      Buffer.add_char buf '\n';
    done; assert false
  with End_of_file ->
    Buffer.contents buf
;;

let read_file file =
  let ic = open_in file in
  let lines = ref [] in
  try
    while true do
      let line = input_line ic in
      lines := line :: !lines
    done; assert false
  with End_of_file ->
    String.concat "\n" !lines

let test = read_file "blah.ml"
于 2013-04-06T08:45:17.323 に答える