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 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函數關閉一個流。