LISP - 檔I/O

我們已經瞭解如何使用標準的輸入和輸出是由Common Lisp處理的參數。所有這些函數讀取和寫入文本檔和二進位檔。唯一不同的是在這種情況下,我們使用流不是標準輸入或輸出,但對於寫入或讀取檔的特定目的的流創建的。

在本章中,我們將看到的LISP如何創建,打開,關閉文本或二進位檔的數據存儲。

檔代表一個位元組序列,如果它是一個文本檔或二進位檔。本章將引導完成重要的功能/宏的檔管理。

打開檔

可以使用open 函數來創建一個新檔或打開一個現有的檔。這是最基本的功能為打開一個檔。然而,with-open-file通常更方便,更常用,因為我們將在本節後面看。

當一個檔被打開,一個流對象被創建來代表它在LISP環境。流上的所有操作基本上等同於操作上的檔。

open 函數語法是:

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

那麼,

  •  filename 參數是要打開或創建的檔的名稱。

  • keyword 參數指定的數據流和錯誤處理方式的類型。

  • :direction keyword 指定的流是否應處理的輸入,輸出,或兩者兼而有之,它採用下列值:

    • :input - 用於輸入流(默認值)

    • :output - 輸出流

    • :io - 雙向流

    • :probe - 只是檢查一個檔是否存在;該流被打開,然後關閉。

  •  :element-type 指定事務單元的流類型。

  • :if-exists 參數指定要採取的操作,如果 :direction 是 :output or :io和指定的名稱已存在的檔。如果方向是direction 為 :input 或 :probe,則忽略此參數。它採用下列值:

    • :error - 它發出錯誤信號。

    • :new-version - 它將創建一個具有相同名稱但大版本號的新檔。

    • :rename - 它重命名現有的檔。

    • :rename-and-delete - 它重命名現有的檔,然後將其刪除。

    • :append - 它追加到現有檔。

    • :supersede - 它將取代現有的檔。

    • nil - 它不創建一個檔甚至流只是返回零表示失敗。

  •  :if-does-not-exist 參數指定,如果指定名稱的檔已經不存在應採取的操作。它採用下列值:

    • :error - 它發出錯誤信號。

    • :create - 它創建具有指定名稱的空文件,然後使用它。

    • nil - 它不創建一個檔或流,而是簡單地返回nil表示失敗。

  • :external-format 參數指定用於表示檔的字元的實施認可制度

例如,可以打開一個名為myfile.txt的存儲在/ tmp檔夾的檔:

(open "/tmp/myfile.txt")

寫入和讀取檔

with-open-file允許讀取或寫入到一個檔中,用與讀/寫事務相關聯的流變數。一旦這項工作完成後,它會自動關閉檔。它使用極為方便。

它的語法如下:

with-open-file (stream filename {options}*)
       {declaration}* {form}*
  • filename 是要打開的檔的名稱;它可以是一個字串,一個路徑,或一個流。

  •  options 就像keyword 參數給函數打開的一樣。

示例 1

創建一個名為main.lisp一個新的源代碼檔,並在其中輸入如下代碼:

(with-open-file (stream "/tmp/myfile.txt" :direction :output)
  (format stream "Welcome to Tutorials zaixian!")
  (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 zaixian!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials   Directory.

關閉檔

close函數關閉一個流。


上一篇: LISP - 輸入和輸出 下一篇: LISP - 結構