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时间和内存与大小的总和呈线性关系,因此迭代连接会表现出二次行为——你想避免这种情况。

您的问题有几种解决方案:

  1. 使用专为累积字符串而设计的Buffer模块
  2. 收集行列表中的行,最后使用高效String.concat : string -> string list -> string功能(文档)一次性将它们连接起来。
  3. 使用为您执行此操作的现有库。例如,Batteries具有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 回答