Czy istnieje sposób, aby za pomocą biblioteki SML Basis otworzyć plik w określonej pozycji? Oznacza to, że należy użyć wywołania systemu operacyjnego, aby zmienić pozycję, zamiast skanować plik i wyrzucać dane.Wyszukiwanie plików za pomocą SML Basis
Odpowiedz
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.
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.
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
@ 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). –