读取文本文件和连接线

时间:2013-04-06 05:21:48

标签: file-io ocaml

我已经发布了一些关于文件IO的问题我只是想找到适合我需要的问题,我发现并且我也googled分配所以我想我的最终文件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”(行;行),显然它无效但我不确定在这种情况下如何使用String.concat方法。

1 个答案:

答案 0 :(得分:4)

在这种情况下,字符串连接不充分,因为str1 ^ str2需要时间和内存线性的大小总和,因此迭代连接将表现出二次行为 - 您希望避免这种情况。

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

  1. 使用精确设计的Buffer模块来累积字符串
  2. 收集行列表中的行,最后使用高效String.concat : string -> string list -> string函数(documentation)将它们全部连接起来。
  3. 使用为您执行此操作的现有库。例如,Batteries具有input_all功能,可将输入通道的全部内容整理到文件中。
  4. 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"