2013-04-06 1 views
1

파일 IO에 대한 몇 가지 질문을 게시했습니다. 내 요구에 맞는 파일을 찾으려고했는데, 찾았습니다. 그래서 최종 파일 입출력 질문은 다음과 같습니다. 명확하게 무효의 선)하지만 난 String.concat 방법을 사용하는 방법이 상황에서 확실 메신저, 나는 String.concat "\ n"(줄을 시도텍스트 파일 및 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;; 

: 당신은 여기에 몇 가지 의사 코드)를 볼 수 있습니다.

답변

4

str1^str2은 크기의 합계에서 시간과 메모리를 선형으로 사용하기 때문에 문자열 결합이 적합하지 않으므로 반복 연결은 2 차 동작을 나타내므로이를 피하십시오.

이 문제에 대한 몇 가지 솔루션은 다음과 같습니다

  1. 를 사용하여 정확하게 라인의 목록에 문자열을
  2. 수집 라인을 축적하기 위해 디자인 된 Buffer 모듈은, 마지막으로 한 번에 모두 연결할 효율적인 String.concat : string -> string list -> string 기능 (documentation).
  3. 이를 위해 기존 라이브러리를 사용하십시오. 예를 들어, Batteriesinput_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" 
관련 문제