LISP - E / S de archivos

Hemos hablado sobre cómo LISP común maneja la entrada y salida estándar. Todas estas funciones funcionan para leer y escribir en archivos de texto y binarios también. En este caso, la única diferencia es que el flujo que usamos no es una entrada o salida estándar, sino un flujo creado con el propósito específico de escribir o leer archivos.

En este capítulo veremos cómo LISP puede crear, abrir, cerrar archivos de texto o binarios para su almacenamiento de datos.

Un archivo representa una secuencia de bytes, no importa si es un archivo de texto o un archivo binario. Este capítulo lo llevará a través de funciones / macros importantes para la administración de archivos.

Abrir archivos

Puedes usar el openfunción para crear un nuevo archivo o para abrir un archivo existente. Es la función más básica para abrir un archivo. sin embargo, elwith-open-file suele ser más conveniente y de uso más común, como veremos más adelante en esta sección.

Cuando se abre un archivo, se construye un objeto de flujo para representarlo en el entorno LISP. Todas las operaciones en la secuencia son básicamente equivalentes a las operaciones en el archivo.

Sintaxis para open la función es -

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

dónde,

  • El nombre de fichero argumento es el nombre del archivo que se abre o se crea.

  • Los argumentos de la palabra clave especifican el tipo de flujo y las formas de manejo de errores.

  • los :direction palabra clave especifica si la secuencia debe manejar entrada, salida o ambas, toma los siguientes valores:

    • : input - para flujos de entrada (valor predeterminado)

    • : salida - para flujos de salida

    • : io - para transmisiones bidireccionales

    • : probe - para comprobar la existencia de un archivo; el arroyo se abre y luego se cierra.

  • los :element-type especifica el tipo de unidad de transacción para el flujo.

  • los :if-existsEl argumento especifica la acción que se debe tomar si: la dirección es: salida o: io y ya existe un archivo con el nombre especificado. Si la dirección es: entrada o: sonda, este argumento se ignora. Toma los siguientes valores:

    • : error: indica un error.

    • : nueva versión: crea un nuevo archivo con el mismo nombre pero con un número de versión más grande.

    • : renombrar: cambia el nombre del archivo existente.

    • : renombrar-y-eliminar: cambia el nombre del archivo existente y luego lo elimina.

    • : append: se agrega al archivo existente.

    • : reemplazar: reemplaza el archivo existente.

    • nil: no crea un archivo o incluso una secuencia simplemente devuelve nil para indicar un error.

  • los :if-does-not-existEl argumento especifica la acción que se debe realizar si un archivo con el nombre especificado no existe. Toma los siguientes valores:

    • : error: indica un error.

    • : crear: crea un archivo vacío con el nombre especificado y luego lo usa.

    • nil: no crea un archivo ni siquiera una secuencia, sino que simplemente devuelve nil para indicar un error.

  • los :external-format argumento especifica un esquema reconocido por la implementación para representar caracteres en archivos.

Por ejemplo, puede abrir un archivo llamado myfile.txt almacenado en la carpeta / tmp como -

(open "/tmp/myfile.txt")

Escribir y leer archivos

los with-open-filepermite leer o escribir en un archivo, utilizando la variable de flujo asociada con la transacción de lectura / escritura. Una vez hecho el trabajo, cierra automáticamente el archivo. Es extremadamente conveniente de usar.

Tiene la siguiente sintaxis:

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • nombre de archivo es el nombre del archivo que se abrirá; puede ser una cadena, un nombre de ruta o una secuencia.

  • Las opciones son las mismas que los argumentos de palabra clave para la función open.

Ejemplo 1

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

(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.")
)

Tenga en cuenta que todas las funciones de entrada y salida discutidas en el capítulo anterior, como terpri y formato, funcionan para escribir en el archivo que creamos aquí.

Cuando ejecuta el código, no devuelve nada; sin embargo, nuestros datos se escriben en el archivo. los:direction :output las palabras clave nos permiten hacer esto.

Sin embargo, podemos leer de este archivo usando el read-line función.

Ejemplo 2

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

(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)
   )
)

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Archivo de cierre

los close La función cierra una secuencia.