LISP - File I / O

Kami telah membahas tentang bagaimana input dan output standar ditangani oleh LISP umum. Semua fungsi ini berfungsi untuk membaca dan menulis ke dalam file teks dan biner juga. Satu-satunya perbedaan adalah dalam hal ini aliran yang kita gunakan bukanlah input atau output standar, tetapi aliran yang dibuat untuk tujuan khusus untuk menulis atau membaca dari file.

Pada bab ini kita akan melihat bagaimana LISP dapat membuat, membuka, menutup file teks atau biner untuk penyimpanan datanya.

File mewakili urutan byte, tidak masalah apakah itu file teks atau file biner. Bab ini akan memandu Anda mempelajari fungsi / makro penting untuk manajemen file.

Membuka File

Anda dapat menggunakan openberfungsi untuk membuat file baru atau membuka file yang sudah ada. Ini adalah fungsi paling dasar untuk membuka file. Namun,with-open-file biasanya lebih nyaman dan lebih umum digunakan, seperti yang akan kita lihat nanti di bagian ini.

Ketika file dibuka, objek aliran dibangun untuk mewakili itu di lingkungan LISP. Semua operasi di aliran pada dasarnya setara dengan operasi pada file.

Sintaks untuk open fungsinya adalah -

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

dimana,

  • The nama file argumen adalah nama file yang akan dibuka atau dibuat.

  • The kata kunci argumen menentukan jenis aliran dan penanganan error cara.

  • Itu :direction kata kunci menentukan apakah aliran harus menangani input, output, atau keduanya, dibutuhkan nilai berikut -

    • : input - untuk aliran input (nilai default)

    • : keluaran - untuk aliran keluaran

    • : io - untuk aliran dua arah

    • : probe - hanya untuk memeriksa keberadaan file; aliran dibuka dan kemudian ditutup.

  • Itu :element-type menentukan jenis unit transaksi untuk aliran.

  • Itu :if-existsargumen menentukan tindakan yang akan diambil jika: direction adalah: output atau: io dan file dengan nama yang ditentukan sudah ada. Jika arahnya adalah: input atau: probe, argumen ini diabaikan. Dibutuhkan nilai-nilai berikut -

    • : error - ini menandakan adanya kesalahan.

    • : versi-baru - ini membuat file baru dengan nama yang sama tetapi nomor versi yang lebih besar.

    • : ganti nama - itu mengganti nama file yang ada.

    • : rename-and-delete - ini mengganti nama file yang ada dan kemudian menghapusnya.

    • : menambahkan - menambahkan ke file yang ada.

    • : supersede - ini menggantikan file yang ada.

    • nil - itu tidak membuat file atau bahkan aliran hanya mengembalikan nihil untuk menunjukkan kegagalan.

  • Itu :if-does-not-existargumen menentukan tindakan yang akan diambil jika file dengan nama yang ditentukan belum ada. Dibutuhkan nilai-nilai berikut -

    • : error - ini menandakan adanya kesalahan.

    • : buat - ini membuat file kosong dengan nama yang ditentukan dan kemudian menggunakannya.

    • nil - ia tidak membuat file atau bahkan streaming, tetapi hanya mengembalikan nil untuk menunjukkan kegagalan.

  • Itu :external-format argumen menentukan skema implementasi yang diakui untuk mewakili karakter dalam file.

Misalnya, Anda dapat membuka file bernama myfile.txt yang disimpan di folder / tmp sebagai -

(open "/tmp/myfile.txt")

Menulis ke dan Membaca dari File

Itu with-open-filememungkinkan membaca atau menulis ke dalam file, menggunakan variabel aliran yang terkait dengan transaksi baca / tulis. Setelah pekerjaan selesai, secara otomatis menutup file. Sangat nyaman digunakan.

Ini memiliki sintaks berikut -

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • nama file adalah nama file yang akan dibuka; bisa berupa string, nama jalur, atau aliran.

  • The pilihan yang sama dengan argumen kata kunci untuk fungsi terbuka.

Contoh 1

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

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

Harap dicatat bahwa semua fungsi input-output yang dibahas di bab sebelumnya, seperti, terpri dan format berfungsi untuk menulis ke dalam file yang kita buat di sini.

Saat Anda menjalankan kode, kode tidak mengembalikan apa pun; namun, data kami ditulis ke dalam file. Itu:direction :output kata kunci memungkinkan kami melakukan ini.

Namun, kita dapat membaca dari file ini menggunakan read-line fungsi.

Contoh 2

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Menutup File

Itu close fungsi menutup aliran.