此第一版是針對 Lua 5.0 所撰寫。雖然在很大程度上仍然適用於後續版本,但有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也可以 贊助 Lua 專案


21.2 – 完整的 I/O 模型

若要更進一步控制 I/O,您可以使用完整的模型。此模型中的核心概念是檔案控制代碼,它等同於 C 中的串流 (FILE*):它代表一個開啟的檔案,並有一個目前位置。

若要開啟檔案,請使用 io.open 函式,它模擬 C 中的 fopen 函式。它接收檔案名稱和模式字串作為引數。模式字串可能包含 `r´(用於讀取)、`w´(用於寫入,同時也會清除檔案中的所有先前內容)或 `a´(用於附加),以及一個用於開啟二進位檔案的選用 `b´。open 函式會傳回檔案的新控制代碼。如果發生錯誤,open 會傳回 nil,以及一個錯誤訊息和錯誤號碼

    print(io.open("non-existent file", "r"))
      --> nil     No such file or directory       2
    
    print(io.open("/etc/passwd", "w"))
      --> nil   Permission denied       13
錯誤號碼的詮釋取決於系統。

檢查錯誤的典型慣用語法是

    local f = assert(io.open(filename, mode))
如果 open 失敗,錯誤訊息會作為 assert 的第二個引數,然後顯示訊息。

開啟檔案後,您可以使用 read/write 方法來讀取或寫入檔案。它們類似於 read/write 函式,但您使用冒號語法在檔案控制代碼上呼叫它們作為方法。例如,若要開啟檔案並讀取所有內容,您可以使用下列程式碼區塊

    local f = assert(io.open(filename, "r"))
    local t = f:read("*all")
    f:close()

I/O 函式庫也提供三個預先定義的 C 串流的控制代碼:io.stdinio.stdoutio.stderr。因此,您可以使用下列程式碼將訊息直接傳送至錯誤串流

    io.stderr:write(message)

我們可以將完整的模型與簡易模型混合使用。我們呼叫 io.input()(不帶引數)來取得目前的輸入檔案控制代碼。我們使用 io.input(handle) 呼叫來設定目前的輸入檔案控制代碼。(類似的呼叫也適用於 io.output。)例如,如果您想要暫時變更目前的輸入檔案,您可以撰寫類似下列的程式碼

    local temp = io.input()   -- save current file
    io.input("newinput")      -- open a new current file
    ...                       -- do something with new input
    io.input():close()        -- close current file
    io.input(temp)            -- restore previous current file