有没有办法使用 SML 基础库在特定位置打开文件?也就是说,使用操作系统调用来更改位置,而不是扫描文件并丢弃数据。
问问题
273 次
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
您也可以对输出流执行等效操作。
于 2013-05-11T22:57:22.227 回答
5
如果您可以设法获得reader/writer,那么它们应该具有getPos
,setPos
和endPos
功能,具体取决于您正在处理的 reader/writer 类型。
于 2013-05-11T21:12:15.180 回答