有没有办法使用SML Basis库在特定位置打开文件?也就是说,使用操作系统调用来改变位置,而不是扫描文件并丢弃数据。
答案 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 :(得分:4)
如果您可以设法抓住reader/writer,那么他们应该拥有getPos
,setPos
和endPos
功能,具体取决于您的读者/作者类型正在处理。