2013-05-11 22 views

Odpowiedz

7

To jest trudne. Niestety poszukiwanie nie jest obsługiwane bezpośrednio. Ponadto pozycje plików są przezroczyste tylko dla plików binarnych, tj. Tych, które zostały otwarte ze strukturą BinIO [1]. W przypadku tej struktury odpowiedni typ BinIO.StreamIO.pos jest zdefiniowany jako Position.int, który jest pewnym typem całkowitym.

Jednak w systemie SML, który obsługuje kompletny I/O stos z normą powinien być w stanie syntetyzować następujących funkcji szukać używając niższe I/O warstw:

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

używać go jak:

val file = BinIO.openIn "filename" 
val _ = seekIn(file, 200) 
val bin = BinIO.inputN(file, 1000) 

Jeśli trzeba przekonwertować z Word8Vector ciąg:

val s = Byte.bytesToString bin 

Możesz również wykonać ekwiwalent dla strumieni.

[1] http://standardml.org/Basis/bin-io.html#BIN_IO:SIG:SPEC

+1

Dobra odpowiedź! Ale po prostu zastanawiałem się ... Jeśli mam czytać plik zasadniczo w sposób losowy (szukanie stosunkowo dużych odległości, a następnie czytanie małych fragmentów), przechodzę przez cały stos IO (imperatyw/strumień/prymitywny IO) tam iz powrotem warto, a może lepiej byłoby po prostu bezpośrednio użyć 'BinPrimIO.reader'? – pyon

+1

@ EduardoLeón, Nie widzę żadnej szczególnej korzyści z bezpośredniego korzystania z interfejsu niskiego poziomu. Ten na wysokim poziomie jest zarówno wygodniejszy, jak i bardziej wydajny (buforowanie i wszystko). –

4

Jeśli uda ci się zdobyć na reader/writer, to powinny one mieć getPos, setPos i endPos funkcje, w zależności od rodzaju czytnika/nagrywarki masz do czynienia.