在SML中使用输入/输出

时间:2014-02-27 20:58:02

标签: io 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 个答案:

答案 0 :(得分: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