LISP - ไฟล์ I / O

เราได้พูดถึงวิธีการจัดการอินพุตและเอาต์พุตมาตรฐานโดย LISP ทั่วไป ฟังก์ชันทั้งหมดนี้ใช้สำหรับการอ่านและเขียนลงในไฟล์ข้อความและไฟล์ไบนารีด้วย ความแตกต่างเพียงอย่างเดียวคือในกรณีนี้สตรีมที่เราใช้ไม่ใช่อินพุตหรือเอาต์พุตมาตรฐาน แต่เป็นสตรีมที่สร้างขึ้นเพื่อวัตถุประสงค์เฉพาะในการเขียนหรืออ่านจากไฟล์

ในบทนี้เราจะมาดูกันว่า LISP สามารถสร้างเปิดปิดไฟล์ข้อความหรือไฟล์ไบนารีสำหรับจัดเก็บข้อมูลได้อย่างไร

ไฟล์แสดงลำดับของไบต์ไม่สำคัญว่าจะเป็นไฟล์ข้อความหรือไฟล์ไบนารี บทนี้จะนำคุณไปสู่ฟังก์ชั่น / มาโครที่สำคัญสำหรับการจัดการไฟล์

กำลังเปิดไฟล์

คุณสามารถใช้ไฟล์ openเพื่อสร้างไฟล์ใหม่หรือเปิดไฟล์ที่มีอยู่ เป็นฟังก์ชันพื้นฐานที่สุดสำหรับการเปิดไฟล์ อย่างไรก็ตามwith-open-file มักจะสะดวกกว่าและนิยมใช้มากกว่าดังที่เราจะเห็นในภายหลังในส่วนนี้

เมื่อเปิดไฟล์อ็อบเจ็กต์สตรีมจะถูกสร้างขึ้นเพื่อแสดงในสภาวะแวดล้อม LISP การดำเนินการทั้งหมดบนสตรีมโดยทั่วไปจะเทียบเท่ากับการดำเนินการกับไฟล์

ไวยากรณ์สำหรับ open ฟังก์ชันคือ -

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

ที่ไหน

  • ชื่อไฟล์อาร์กิวเมนต์เป็นชื่อของไฟล์ที่จะเปิดหรือสร้าง

  • คำหลักข้อโต้แย้งระบุชนิดของกระแสและวิธีการจัดการข้อผิดพลาด

  • :direction คีย์เวิร์ดระบุว่าสตรีมควรจัดการอินพุตเอาต์พุตหรือทั้งสองอย่างโดยใช้ค่าต่อไปนี้ -

    • : input - สำหรับอินพุตสตรีม (ค่าเริ่มต้น)

    • : เอาต์พุต - สำหรับสตรีมเอาต์พุต

    • : io - สำหรับสตรีมแบบสองทิศทาง

    • : probe - สำหรับตรวจสอบการมีอยู่ของไฟล์เท่านั้น สตรีมถูกเปิดแล้วปิด

  • :element-type ระบุประเภทของหน่วยธุรกรรมสำหรับสตรีม

  • :if-existsอาร์กิวเมนต์ระบุการดำเนินการที่จะดำเนินการหาก: direction is: output หรือ: io และไฟล์ชื่อที่ระบุมีอยู่แล้ว ถ้าทิศทางคืออินพุตหรือ: โพรบอาร์กิวเมนต์นี้จะถูกละเว้น ใช้ค่าต่อไปนี้ -

    • : error - ส่งสัญญาณข้อผิดพลาด

    • : new-version - สร้างไฟล์ใหม่ที่มีชื่อเดียวกัน แต่มีหมายเลขเวอร์ชันใหญ่กว่า

    • : เปลี่ยนชื่อ - เปลี่ยนชื่อไฟล์ที่มีอยู่

    • : เปลี่ยนชื่อและลบ - มันเปลี่ยนชื่อไฟล์ที่มีอยู่แล้วลบมัน

    • : append - มันต่อท้ายไฟล์ที่มีอยู่

    • : supersede - แทนที่ไฟล์ที่มีอยู่

    • ศูนย์ - มันไม่ได้สร้างไฟล์หรือสตรีมเพียงแค่ส่งคืนค่าศูนย์เพื่อบ่งชี้ความล้มเหลว

  • :if-does-not-existอาร์กิวเมนต์ระบุการดำเนินการที่จะดำเนินการหากไฟล์ชื่อที่ระบุไม่มีอยู่ ใช้ค่าต่อไปนี้ -

    • : error - ส่งสัญญาณข้อผิดพลาด

    • : สร้าง - สร้างไฟล์ว่างพร้อมชื่อที่ระบุจากนั้นใช้

    • ศูนย์ - มันไม่ได้สร้างไฟล์หรือแม้แต่สตรีม แต่เพียงแค่ส่งกลับค่าศูนย์เพื่อระบุความล้มเหลว

  • :external-format อาร์กิวเมนต์ระบุโครงร่างที่รู้จักการนำไปใช้สำหรับการแสดงอักขระในไฟล์

ตัวอย่างเช่นคุณสามารถเปิดไฟล์ชื่อ myfile.txt ที่เก็บไว้ในโฟลเดอร์ / tmp เป็น -

(open "/tmp/myfile.txt")

การเขียนและอ่านจากไฟล์

with-open-fileอนุญาตให้อ่านหรือเขียนลงในไฟล์โดยใช้ตัวแปรสตรีมที่เกี่ยวข้องกับธุรกรรมการอ่าน / เขียน เมื่องานเสร็จสิ้นมันจะปิดไฟล์โดยอัตโนมัติ สะดวกในการใช้งานมาก

มีไวยากรณ์ต่อไปนี้ -

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • ชื่อไฟล์คือชื่อของไฟล์ที่จะเปิด อาจเป็นสตริงชื่อพา ธ หรือสตรีม

  • ตัวเลือกเช่นเดียวกับข้อโต้แย้งคำหลักเพื่อเปิดฟังก์ชั่น

ตัวอย่าง 1

สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้

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

โปรดทราบว่าฟังก์ชันอินพุต - เอาท์พุตทั้งหมดที่กล่าวถึงในบทที่แล้วเช่น terpri และ format กำลังทำงานสำหรับการเขียนลงในไฟล์ที่เราสร้างไว้

เมื่อคุณรันโค้ดมันจะไม่ส่งคืนอะไรเลย อย่างไรก็ตามข้อมูลของเราถูกเขียนลงในไฟล์ :direction :output คำหลักช่วยให้เราทำสิ่งนี้ได้

อย่างไรก็ตามเราสามารถอ่านจากไฟล์นี้โดยใช้ไฟล์ read-line ฟังก์ชัน

ตัวอย่าง 2

สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้

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

เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -

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

กำลังปิดไฟล์

close ฟังก์ชันปิดสตรีม