我們已經了解如何使用標準的輸入和輸出是由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 Yiibai!") (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 Yiibai! This is a tutorials database Submit your Tutorials, White Papers and Articles into our Tutorials Directory.
close函式關閉一個流。