SML Basis ライブラリを使用して、特定の位置でファイルを開く方法はありますか? つまり、ファイルをスキャンしてデータを破棄するのではなく、オペレーティング システム コールを使用して位置を変更します。
質問する
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
リーダー/ライターをなんとか手に入れることができれば、扱っているリーダー/ライターの種類に応じて、、、および機能がgetPos
必要setPos
です。endPos
于 2013-05-11T21:12:15.180 に答える