C'è un modo, utilizzando la libreria Basi SML, per aprire un file in una posizione specifica? Cioè, usa una chiamata al sistema operativo per cambiare la posizione, piuttosto che scansionare il file e buttare via i dati.Ricerca di file con base SML
risposta
Questo è difficile. Sfortunatamente, la ricerca non è direttamente supportata. Inoltre, le posizioni dei file sono trasparenti solo per i file binari, cioè quelli che sono stati aperti con la struttura BinIO
[1]. Per questa struttura, il tipo corrispondente BinIO.StreamIO.pos
è definito come Position.int
, che è un tipo intero.
Tuttavia, in un sistema SML che supporta lo stack completo di I/O da quella standard si dovrebbe essere in grado di sintetizzare la seguente funzione cercare utilizzando i più bassi di I/O strati:
(* 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
}
utilizzarlo come:
val file = BinIO.openIn "filename"
val _ = seekIn(file, 200)
val bin = BinIO.inputN(file, 1000)
Se avete bisogno di convertire da Word8Vector a stringa:
val s = Byte.bytesToString bin
Puoi anche fare l'equivalente per i flussi esterni.
Se si riesce a entrare in possesso del reader/writer, allora non dovrebbe avere getPos
, setPos
e endPos
funzioni, a seconda di quale tipo di lettore/scrittore si sta trattando.
- 1. Vim modifica la larghezza di spostamento per i file .sml
- 2. Apre ed esegue il file nell'interprete SML dall'interno di Vim
- 3. Typecasting in SML
- 4. Google ha un'API di ricerca di base?
- 5. Stampa solo output di stampa con SML/NJ
- 6. Ricerca nome file con ElasticSearch
- 7. Uso di base della ricerca sitecore
- 8. curry funzione anonima in SML
- 9. Funzioni di ordinamento standard in SML?
- 10. Ricerca di "." con string.find()
- 11. SML - variabile non legato o costruttore
- 12. file di ricerca linux basato sul modello nome file
- 13. file esiste in base al nome del file di pattern
- 14. Ricerca file ricorsiva (PHP)
- 15. Problema con l'autenticazione di accesso di base nel file downloader
- 16. implementazione di un motore di ricerca di base con albero di prefisso
- 17. Elasticsearch.net cliente non può fare ricerca di base
- 18. Mongoose - ricerca di documenti secondari in base ai criteri
- 19. Ricerca di testo con tutti i file .xib in Xcode?
- 20. Ricerca in file di grandi dimensioni con ifstream
- 21. Ricerca di stringhe multiple in diversi file con Sublime 3
- 22. RubyMine progetto di ricerca per il file in base al percorso
- 23. Ricerca file in Eclipse
- 24. ricerca file delphi multithreading
- 25. Gli SKU Magento non funzionano nella ricerca di base
- 26. SQL Select Raggio Ricerca sulla base di Latitudine Longitudine
- 27. operatore [] di ricerca in classi base del modello
- 28. Mostra div in base alla ricerca di testo
- 29. Golang: Come servire file statici con autenticazione di base
- 30. Ricerca con WebAPI
Bella risposta! Ma mi chiedevo ... Se sto andando a leggere un file essenzialmente in modo casuale (cercando distanze relativamente lunghe e poi leggendo piccoli pezzi), sto attraversando l'intero stack IO (imperativo/stream/primitivo IO) avanti e indietro davvero ne vale la pena, o forse sarebbe meglio usare semplicemente il 'BinPrimIO.reader' direttamente? – pyon
@ EduardoLeón, non vedo alcun vantaggio particolare nell'utilizzare direttamente l'interfaccia di basso livello. Quello di alto livello è sia più conveniente che più efficiente (buffering e tutto). –