5

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

4

2 回答 2

8

这很棘手。不幸的是,不直接支持搜索。此外,文件位置仅对二进制文件是透明的,即那些您以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

于 2013-05-11T22:57:22.227 回答
5

如果您可以设法获得reader/writer,那么它们应该具有getPos,setPosendPos功能,具体取决于您正在处理的 reader/writer 类型。

于 2013-05-11T21:12:15.180 回答