5

SML Basis ライブラリを使用して、特定の位置でファイルを開く方法はありますか? つまり、ファイルをスキャンしてデータを破棄するのではなく、オペレーティング システム コールを使用して位置を変更します。

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

リーダー/ライターをなんとか手に入れることができれば、扱っているリーダー/ライターの種類に応じて、、、および機能がgetPos必要setPosです。endPos

于 2013-05-11T21:12:15.180 に答える