2014-02-27 1 views
0

SML의 일부 입출력 기능을 가지고 놀고 있습니다. 전체 내용을 복사하는 대신 특정 파일의 특정 내용을 다른 파일로 복사 할 수 있는지 궁금합니다.SML의 입/출력 사용

정수 목록을 반환하는 텍스트 파일 중 하나에 함수가 있고이 결과 목록을 빈 출력 파일에 복사한다고 가정 해보십시오. 그리고 이것이 가능하다면 어떻게 copyFile 함수를 적용하여 목록을 출력 파일에 자동으로 복사 할 수 있습니까? 그것은 개별 문자를 복사 이후, 모든

fun copyFile(infile: string, outfile: string) = 
    let 
    val In = TextIO.openIn infile 
    val Out = TextIO.openOut outfile 
    fun helper(copt: char option) = 
     case copt of 
      NONE => (TextIO.closeIn In; TextIO.closeOut Out) 
     | SOME(c) => (TextIO.output1(Out,c); helper(TextIO.input1 In)) 
    in 
    helper(TextIO.input1 In) 
    end 

답변

1

먼저, 함수 오히려 비효율적 같습니다

는 여기에 하나 개의 파일에서 다른 전체 텍스트를 복사에 대한 사용하고 기능입니다. 단순히 다음을 수행하지 않는 이유는 무엇입니까?

fun copyFile(infile : string, outfile : string) = 
    let 
     val ins = TextIO.openIn infile 
     val outs = TextIO.openOut outfile 
    in 
     TextIO.output(outs, TextIO.inputAll ins); 
     TextIO.closeIn ins; TextIO.closOut outs 
    end 

또한 오류가 발생하면 파일을 닫아야합니다.

어쨌든 당신의 진정한 질문에 답하기 위해서 : 당신이 읽기 시작하기 전에 파일의 특정한 오프셋으로 뛰어 넘을 수있는 어떤 종류의 탐색 기능을 요구하고있는 것처럼 보입니다. 불행히도 SML 라이브러리에서는 이러한 함수를 쉽게 사용할 수 없습니다 (주로 텍스트 스트림에서 의미가 없기 때문에). 하지만 이진 파일을 구현할 수 있어야합니다 (my answer here 참조). 그걸로 쓸 수 있어요

fun copyFile(infile, offset, length, outfile) = 
    let 
     val ins = BinIO.openIn infile 
     val outs = BinIO.openOut outfile 
    in 
     seekIn(ins, offset); 
     BinIO.output(outs, BinIO.inputN(ins, length)); 
     BinIO.closeIn ins; BinIO.closOut outs 
    end