我正在玩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
答案 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