LISP - E / S fichier

Nous avons discuté de la façon dont l'entrée et la sortie standard sont gérées par LISP commun. Toutes ces fonctions fonctionnent également pour lire et écrire dans des fichiers texte et binaires. La seule différence est que dans ce cas, le flux que nous utilisons n'est pas une entrée ou une sortie standard, mais un flux créé dans le but spécifique d'écrire ou de lire des fichiers.

Dans ce chapitre, nous verrons comment LISP peut créer, ouvrir, fermer des fichiers texte ou binaires pour leur stockage de données.

Un fichier représente une séquence d'octets, peu importe qu'il s'agisse d'un fichier texte ou d'un fichier binaire. Ce chapitre vous présente les fonctions / macros importantes pour la gestion des fichiers.

Ouverture de fichiers

Vous pouvez utiliser le openfonction pour créer un nouveau fichier ou pour ouvrir un fichier existant. C'est la fonction la plus basique pour ouvrir un fichier. Cependant, lewith-open-file est généralement plus pratique et plus couramment utilisé, comme nous le verrons plus loin dans cette section.

Lorsqu'un fichier est ouvert, un objet de flux est construit pour le représenter dans l'environnement LISP. Toutes les opérations sur le flux sont fondamentalement équivalentes aux opérations sur le fichier.

Syntaxe du open la fonction est -

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

où,

  • L' argument filename est le nom du fichier à ouvrir ou à créer.

  • Les arguments de mot-clé spécifient le type de flux et les méthodes de gestion des erreurs.

  • le :direction mot-clé spécifie si le flux doit gérer l'entrée, la sortie ou les deux, il prend les valeurs suivantes -

    • : input - pour les flux d'entrée (valeur par défaut)

    • : sortie - pour les flux de sortie

    • : io - pour les flux bidirectionnels

    • : sonde - pour vérifier simplement l'existence d'un fichier; le flux est ouvert puis fermé.

  • le :element-type spécifie le type d'unité de transaction pour le flux.

  • le :if-existsL'argument spécifie l'action à entreprendre si: direction est: sortie ou: io et qu'un fichier du nom spécifié existe déjà. Si la direction est: entrée ou: sonde, cet argument est ignoré. Il prend les valeurs suivantes -

    • : error - cela signale une erreur.

    • : new-version - il crée un nouveau fichier avec le même nom mais un numéro de version plus grand.

    • : renommer - il renomme le fichier existant.

    • : renommer et supprimer - il renomme le fichier existant puis le supprime.

    • : append - il ajoute au fichier existant.

    • : supersede - il remplace le fichier existant.

    • nil - il ne crée pas de fichier ou même un flux renvoie simplement nil pour indiquer un échec.

  • le :if-does-not-existL'argument spécifie l'action à entreprendre si un fichier du nom spécifié n'existe pas déjà. Il prend les valeurs suivantes -

    • : error - cela signale une erreur.

    • : create - il crée un fichier vide avec le nom spécifié et l'utilise ensuite.

    • nil - il ne crée pas de fichier ni même de flux, mais renvoie simplement nil pour indiquer un échec.

  • le :external-format L'argument spécifie un schéma reconnu par l'implémentation pour représenter les caractères dans les fichiers.

Par exemple, vous pouvez ouvrir un fichier nommé myfile.txt stocké dans le dossier / tmp comme -

(open "/tmp/myfile.txt")

Écriture et lecture de fichiers

le with-open-filepermet la lecture ou l'écriture dans un fichier, en utilisant la variable stream associée à la transaction de lecture / écriture. Une fois le travail terminé, il ferme automatiquement le fichier. Il est extrêmement pratique à utiliser.

Il a la syntaxe suivante -

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • filename est le nom du fichier à ouvrir; il peut s'agir d'une chaîne, d'un chemin d'accès ou d'un flux.

  • Les options sont les mêmes que les arguments de mot-clé de la fonction open.

Exemple 1

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

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

Veuillez noter que toutes les fonctions d'entrée-sortie décrites dans le chapitre précédent, telles que terpri et format fonctionnent pour l'écriture dans le fichier que nous avons créé ici.

Lorsque vous exécutez le code, il ne renvoie rien; cependant, nos données sont écrites dans le fichier. le:direction :output les mots clés nous permettent de le faire.

Cependant, nous pouvons lire ce fichier en utilisant le read-line fonction.

Exemple 2

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

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

Lorsque vous exécutez le code, il renvoie le résultat suivant -

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

Clôture du dossier

le close La fonction ferme un flux.