使用SML Basis搜索文件

时间:2013-05-11 16:19:22

标签: functional-programming sml ml

有没有办法使用SML Basis库在特定位置打开文件?也就是说,使用操作系统调用来改变位置,而不是扫描文件并丢弃数据。

2 个答案:

答案 0 :(得分:7)

这很棘手。不幸的是,寻求不是直接支持的。此外,文件位置仅对二进制文件是透明的,即您使用BinIO结构打开的文件[1]。对于此结构,相应的类型BinIO.StreamIO.pos被定义为Position.int,这是一些整数类型。

但是,在支持标准的完整I / O堆栈的SML系统中,您应该能够使用较低的I / O层合成以下搜索功能:

(* seekIn : BinIO.instream * Position.int -> unit *)

fun seekIn(instream, pos) =
    case BinIO.StreamIO.getReader(BinIO.getInstream instream) of
      (reader as BinPrimIO.RD{setPos = SOME f, ...}, _) =>
        ( f pos;
          BinIO.setInstream(instream,
            BinIO.StreamIO.mkInstream(reader, Word8Vector.fromList[]))
        )
    | (BinPrimIO.RD{name, ...}, _) =>
        raise IO.Io{
          name = name,
          function = "seekIn",
          cause = IO.RandomAccessNotSupported
        }

使用它像:

val file = BinIO.openIn "filename"
val _    = seekIn(file, 200)
val bin  = BinIO.inputN(file, 1000)

如果需要从Word8Vector转换为字符串:

val s = Byte.bytesToString bin

你也可以为外流做同等的事情。

[1] http://standardml.org/Basis/bin-io.html#BIN_IO:SIG:SPEC

答案 1 :(得分:4)

如果您可以设法抓住reader/writer,那么他们应该拥有getPossetPosendPos功能,具体取决于您的读者/作者类型正在处理。