LISP - Dosya G / Ç

Standart girdi ve çıkışın ortak LISP tarafından nasıl ele alındığını tartıştık. Tüm bu işlevler, metin ve ikili dosyalardan okumak ve bunlara yazmak için de çalışır. Bu durumda tek fark, kullandığımız akışın standart girdi veya çıktı değil, dosyalara yazmak veya dosyalardan okumak için özel bir amaç için oluşturulmuş bir akış olmasıdır.

Bu bölümde, LISP'in veri depolamak için metin veya ikili dosyaları nasıl oluşturduğunu, açtığını, kapattığını göreceğiz.

Bir dosya, bir metin dosyası veya ikili dosya olması fark etmez, bir bayt dizisini temsil eder. Bu bölüm, dosya yönetimi için önemli işlevler / makrolar konusunda size yol gösterecektir.

Dosyaları Açma

Kullanabilirsiniz openyeni bir dosya oluşturma veya mevcut bir dosyayı açma işlevi. Bir dosyayı açmak için en temel işlevdir. Ancakwith-open-file bu bölümde daha sonra göreceğimiz gibi genellikle daha kullanışlıdır ve daha yaygın olarak kullanılır.

Bir dosya açıldığında, onu LISP ortamında temsil edecek bir akış nesnesi oluşturulur. Akış üzerindeki tüm işlemler, temelde dosyadaki işlemlere eşdeğerdir.

İçin sözdizimi open işlev -

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

nerede,

  • Dosya adı argümanı dosyanın adı açılmış veya oluşturulan gerekmektedir.

  • Anahtar kelime argümanlar akışı ve hata işleme yolları türünü belirtin.

  • :direction anahtar kelime, akışın girişi mi, çıkışı mı yoksa her ikisini birden mi işleyeceğini belirtir, aşağıdaki değerleri alır -

    • : girdi - giriş akışları için (varsayılan değer)

    • : output - çıktı akışları için

    • : io - çift yönlü akışlar için

    • : probe - sadece bir dosyanın varlığını kontrol etmek için; akış açılır ve sonra kapatılır.

  • :element-type akış için işlem biriminin türünü belirtir.

  • :if-existsargüman: direction: output veya: io ise ve belirtilen adda bir dosya zaten mevcutsa gerçekleştirilecek eylemi belirtir. Yön: input veya: prob ise, bu argüman yok sayılır. Aşağıdaki değerleri alır -

    • : hata - bir hata bildirir.

    • : yeni-sürüm - aynı ada ancak daha büyük sürüm numarasına sahip yeni bir dosya oluşturur.

    • : rename - mevcut dosyayı yeniden adlandırır.

    • : rename-and-delete - mevcut dosyayı yeniden adlandırır ve sonra siler.

    • : append - mevcut dosyaya eklenir.

    • : yerini alır - mevcut dosyanın yerini alır.

    • nil - bir dosya oluşturmaz veya bir akım bile başarısızlığı belirtmek için sıfır döndürür.

  • :if-does-not-existargüman, belirtilen adda bir dosya halihazırda mevcut değilse yapılacak eylemi belirtir. Aşağıdaki değerleri alır -

    • : hata - bir hata bildirir.

    • : oluştur - belirtilen adla boş bir dosya oluşturur ve onu kullanır.

    • nil - bir dosya veya hatta bir akış oluşturmaz, bunun yerine başarısızlığı belirtmek için nil döndürür.

  • :external-format argüman, dosyalardaki karakterleri temsil etmek için uygulama tarafından tanınan bir şema belirtir.

Örneğin, / tmp klasöründe saklanan dosyam.txt adlı bir dosyayı şu şekilde açabilirsiniz:

(open "/tmp/myfile.txt")

Dosyalara Yazma ve Dosyalardan Okuma

with-open-fileokuma / yazma işlemiyle ilişkili akım değişkenini kullanarak bir dosyaya okumaya veya yazmaya izin verir. İş bittiğinde, dosyayı otomatik olarak kapatır. Kullanımı son derece uygundur.

Aşağıdaki sözdizimine sahiptir -

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • dosya adı, açılacak dosyanın adıdır; bir dize, yol adı veya akış olabilir.

  • Seçenekleri fonksiyonu açıkken için anahtar kelime argümanları ile aynıdır.

örnek 1

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Lütfen önceki bölümde tartışılan terpri ve format gibi tüm girdi-çıktı işlevlerinin burada oluşturduğumuz dosyaya yazmak için çalıştığını unutmayın.

Kodu çalıştırdığınızda hiçbir şey döndürmez; ancak verilerimiz dosyaya yazılır. :direction :output anahtar kelimeler bunu yapmamıza izin verir.

Ancak, bunu kullanarak bu dosyadan okuyabiliriz. read-line işlevi.

Örnek 2

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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

Dosya Kapatılıyor

close işlevi bir akışı kapatır.