LISP - File I / O

Abbiamo discusso su come l'input e l'output standard vengono gestiti da LISP comune. Tutte queste funzioni funzionano anche per leggere e scrivere in file di testo e binari. L'unica differenza è che in questo caso il flusso che usiamo non è input o output standard, ma un flusso creato per lo scopo specifico di scrivere o leggere da file.

In questo capitolo vedremo come LISP può creare, aprire, chiudere file di testo o binari per la loro memorizzazione dei dati.

Un file rappresenta una sequenza di byte, non importa se si tratta di un file di testo o di un file binario. Questo capitolo ti guiderà attraverso importanti funzioni / macro per la gestione dei file.

Apertura di file

Puoi usare il file openfunzione per creare un nuovo file o per aprire un file esistente. È la funzione più semplice per aprire un file. in ogni caso, ilwith-open-file di solito è più conveniente e più comunemente usato, come vedremo più avanti in questa sezione.

Quando un file viene aperto, viene costruito un oggetto stream per rappresentarlo nell'ambiente LISP. Tutte le operazioni sul flusso sono sostanzialmente equivalenti alle operazioni sul file.

Sintassi per open la funzione è -

open filename &key :direction :element-type :if-exists :if-does-not-exist :external-format

dove,

  • L' argomento nome file è il nome del file da aprire o creare.

  • Gli argomenti della parola chiave specificano il tipo di flusso e le modalità di gestione degli errori.

  • Il :direction la parola chiave specifica se il flusso deve gestire input, output o entrambi, accetta i seguenti valori:

    • : input - per flussi di input (valore predefinito)

    • : output - per flussi di output

    • : io - per flussi bidirezionali

    • : probe - per controllare solo l'esistenza di un file; il flusso viene aperto e quindi chiuso.

  • Il :element-type specifica il tipo di unità di transazione per il flusso.

  • Il :if-existsargomento specifica l'azione da intraprendere se la direzione: è: output o: io e un file con il nome specificato esiste già. Se la direzione è: input o: probe, questo argomento viene ignorato. Prende i seguenti valori:

    • : errore - segnala un errore.

    • : new-version - crea un nuovo file con lo stesso nome ma con un numero di versione maggiore.

    • : rename - rinomina il file esistente.

    • : rinomina ed elimina: rinomina il file esistente e quindi lo elimina.

    • : append - aggiunge al file esistente.

    • : supersede - sostituisce il file esistente.

    • nil - non crea un file o anche un flusso restituisce semplicemente nil per indicare un errore.

  • Il :if-does-not-existargomento specifica l'azione da intraprendere se un file con il nome specificato non esiste già. Prende i seguenti valori:

    • : errore - segnala un errore.

    • : create - crea un file vuoto con il nome specificato e quindi lo utilizza.

    • nil - non crea un file o anche un flusso, ma restituisce semplicemente nil per indicare un errore.

  • Il :external-format argomento specifica uno schema riconosciuto dall'implementazione per rappresentare i caratteri nei file.

Ad esempio, puoi aprire un file denominato myfile.txt archiviato nella cartella / tmp come -

(open "/tmp/myfile.txt")

Scrittura e lettura da file

Il with-open-fileconsente la lettura o la scrittura in un file, utilizzando la variabile stream associata alla transazione di lettura / scrittura. Una volta terminato il lavoro, chiude automaticamente il file. È estremamente comodo da usare.

Ha la seguente sintassi:

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • nomefile è il nome del file da aprire; può essere una stringa, un percorso o un flusso.

  • Le opzioni sono le stesse degli argomenti della parola chiave per la funzione open.

Esempio 1

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.

(with-open-file (stream "/tmp/myfile.txt" :direction :output)
   (format stream "Welcome to Tutorials Point!")
   (terpri stream)
   (format stream "This is a tutorials database")
   (terpri stream)
   (format stream "Submit your Tutorials, White Papers and Articles into our Tutorials   Directory.")
)

Si noti che tutte le funzioni di input-output discusse nel capitolo precedente, come, terpri e format, funzionano per la scrittura nel file che abbiamo creato qui.

Quando si esegue il codice, non viene restituito nulla; tuttavia, i nostri dati vengono scritti nel file. Il:direction :output le parole chiave ci consentono di farlo.

Tuttavia, possiamo leggere da questo file utilizzando l'estensione read-line funzione.

Esempio 2

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.

(let ((in (open "/tmp/myfile.txt" :if-does-not-exist nil)))
   (when in
      (loop for line = (read-line in nil)
      
      while line do (format t "~a~%" line))
      (close in)
   )
)

Quando esegui il codice, restituisce il seguente risultato:

Welcome to Tutorials Point!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials Directory.

File di chiusura

Il close la funzione chiude un flusso.