2013-05-11 7 views
5

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

答えて

7

これは扱いにくいです。残念ながら、シークは直接サポートされていません。さらに、ファイルの位置は、バイナリファイル、すなわちBinIO構造[1]で開かれたものに対してのみ透過的です。この構造の場合、対応するタイプBinIO.StreamIO.posは、整数タイプのPosition.intと定義されています。それはように使用

(* 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 
     } 

しかし、標準から完全なI/OスタックをサポートしているSMLシステムでは、あなたは下のI/Oレイヤを使用して関数を求め、以下の合成することができるはずです。

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

+1

ニースの回答!しかし、私はちょうど不思議だった...ファイルを本質的にランダムに読んで(比較的長距離を探して小さなチャンクを読む)、IOスタック全体(命令/ストリーム/プリミティブIO)を実際に前後に移動しているそれとも、単に 'BinPrimIO.reader'を直接使う方が良いでしょうか? – pyon

+1

@EduardoLeón、私は低レベルのインターフェイスを直接使用する際に特に利点はありません。高レベルのものは、より便利で効率的です(バッファリングとすべて)。 –

4

あなたがreader/writerのホールドを取得するために管理することができれば、彼らはあなたが扱っているリーダ/ライタの種類に応じて、getPossetPosendPos機能を持っている必要があります。