鍍金池/ 教程/ Java/ LISP - 文件I/O
LISP - 樹(shù)
LISP - 錯(cuò)誤處理
LISP - 謂詞
LISP - 決策
LISP - 變量
LISP - 數(shù)組
LISP - 對(duì)象系統(tǒng)(CLOS)
LISP - 輸入和輸出
Lisp教程
LISP - 數(shù)字
LISP - 循環(huán)
LISP - 常量
LISP - 集合
LISP - 字符
LISP - 程序結(jié)構(gòu)
LISP - 文件I/O
LISP - 哈希表
LISP - 宏
LISP - 數(shù)據(jù)類型
LISP - 包
LISP - 符號(hào)
LISP - 運(yùn)算符
LISP - 基本語(yǔ)法
LISP - 函數(shù)
LISP - 向量
LISP - 結(jié)構(gòu)
LISP - 概述介紹

LISP - 文件I/O

我們已經(jīng)了解如何使用標(biāo)準(zhǔn)的輸入和輸出是由Common Lisp處理的參數(shù)。所有這些函數(shù)讀取和寫入文本文件和二進(jìn)制文件。唯一不同的是在這種情況下,我們使用流不是標(biāo)準(zhǔn)輸入或輸出,但對(duì)于寫入或讀取文件的特定目的的流創(chuàng)建的。

在本章中,我們將看到的LISP如何創(chuàng)建,打開(kāi),關(guān)閉文本或二進(jìn)制文件的數(shù)據(jù)存儲(chǔ)。

文件代表一個(gè)字節(jié)序列,如果它是一個(gè)文本文件或二進(jìn)制文件。本章將引導(dǎo)完成重要的功能/宏的文件管理。

打開(kāi)文件

可以使用open 函數(shù)來(lái)創(chuàng)建一個(gè)新文件或打開(kāi)一個(gè)現(xiàn)有的文件。這是最基本的功能為打開(kāi)一個(gè)文件。然而,with-open-file通常更方便,更常用,因?yàn)槲覀儗⒃诒竟?jié)后面看。

當(dāng)一個(gè)文件被打開(kāi),一個(gè)流對(duì)象被創(chuàng)建來(lái)代表它在LISP環(huán)境。流上的所有操作基本上等同于操作上的文件。

open 函數(shù)語(yǔ)法是:

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

那么,

  •  filename 參數(shù)是要打開(kāi)或創(chuàng)建的文件的名稱。

  • keyword 參數(shù)指定的數(shù)據(jù)流和錯(cuò)誤處理方式的類型。

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

    • :input - 用于輸入流(默認(rèn)值)

    • :output - 輸出流

    • :io - 雙向流

    • :probe - 只是檢查一個(gè)文件是否存在;該流被打開(kāi),然后關(guān)閉。

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

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

    • :error - 它發(fā)出錯(cuò)誤信號(hào)。

    • :new-version - 它將創(chuàng)建一個(gè)具有相同名稱但大版本號(hào)的新文件。

    • :rename - 它重命名現(xiàn)有的文件。

    • :rename-and-delete - 它重命名現(xiàn)有的文件,然后將其刪除。

    • :append - 它追加到現(xiàn)有文件。

    • :supersede - 它將取代現(xiàn)有的文件。

    • nil - 它不創(chuàng)建一個(gè)文件甚至流只是返回零表示失敗。

  •  :if-does-not-exist 參數(shù)指定,如果指定名稱的文件已經(jīng)不存在應(yīng)采取的操作。它采用下列值:

    • :error - 它發(fā)出錯(cuò)誤信號(hào)。

    • :create - 它創(chuàng)建具有指定名稱的空文件,然后使用它。

    • nil - 它不創(chuàng)建一個(gè)文件或流,而是簡(jiǎn)單地返回nil表示失敗。

  • :external-format 參數(shù)指定用于表示文件的字符的實(shí)施認(rèn)可制度

例如,可以打開(kāi)一個(gè)名為myfile.txt的存儲(chǔ)在/ tmp文件夾的文件:

(open "/tmp/myfile.txt")

寫入和讀取文件

with-open-file允許讀取或?qū)懭氲揭粋€(gè)文件中,用與讀/寫事務(wù)相關(guān)聯(lián)的流變量。一旦這項(xiàng)工作完成后,它會(huì)自動(dòng)關(guān)閉文件。它使用極為方便。

它的語(yǔ)法如下:

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

  •  options 就像keyword 參數(shù)給函數(shù)打開(kāi)的一樣。

示例 1

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

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

請(qǐng)注意,在前面的章節(jié),如,terpri和format討論的所有輸入輸出函數(shù)正在編寫到創(chuàng)建的文件。

當(dāng)執(zhí)行代碼,它不返回任何東西;然而,數(shù)據(jù)被寫入到該文件中。 :direction :output關(guān)鍵字可以做到這一點(diǎn)。

不過(guò),我們可以使用read-line函數(shù)從這個(gè)文件中讀取。

實(shí)例 2

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

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

當(dāng)執(zhí)行代碼,它返回以下結(jié)果:

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

關(guān)閉文件

close函數(shù)關(guān)閉一個(gè)流。