2013-04-06 65 views
1

我已经发布了一些关于文件IO的问题我只是想为我的需求找到合适的一个,我已经找到了,并且我也使用了Google Allog配置,所以我想我的最终文件IO问题是(你会看到这里的一些伪代码):阅读文本文件和concat行

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方法即时通讯不确定。

回答

4

字符串连接在这种情况下是不够的,因为str1^str2需要时间和内存线性的大小的总和,所以迭代连接将呈现二次行为 - 你想避免这种情况。

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

  1. 使用Buffer模块被精确设计积累字符串行的列表
  2. 收集线,最后将它们连接起来的所有一气呵成与高效的String.concat : string -> string list -> string函数(documentation)。
  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"