Lua基礎學習 五

2021-09-11 00:28:04 字數 3967 閱讀 6652

簡單i/o模型假設有乙個當前輸入檔案和乙個當前輸出檔案,它的i/o操作均作用於這些檔案。

開啟檔案操作語句:

file = io.open(filename [,mode])
mode 的值有:

模式描述

r以唯讀方式開啟檔案,該檔案必須存在。

w開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。

a以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(eof符保留)

r+以可讀寫方式開啟檔案,該檔案必須存在。

w+開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。

a+與a類似,但此檔案可讀可寫

b二進位制模式,如果檔案是二進位制檔案,可以加上b

+號表示對檔案既可以讀也可以寫

簡單示例:

file = io.output("test.txt")  --設定輸出檔案

io.write("簡單i/o模型--測試檔案") --寫入一行

io.close(file)

io.input("test.txt") --設定輸入檔案

print(io.read()) --輸出檔案第一行

輸出:

設定輸出檔案的時候檔案是不需要存在的,但是設定輸出檔案的時候檔案必須存在!

io.read() 還可以帶引數,引數分別如下:

"*l"

讀取一行,預設的就是這個 

"*a"

讀取整個檔案

"*n"

讀取乙個數字

number

返回乙個不超過number個數的字串

特殊io.read(0) 用來檢查是否到達了檔案末尾。還有資料可以讀取返回空的字串,否則返回nil。 

其他的 io操作:

完整i/o模型則使用顯式的檔案控制代碼,它採用了物件導向的風格,並將所有的操作定義為檔案控制代碼上的方法。

示例: 

local file = io.open("test.txt","a")

file:write("完整i/o模型--測試檔案")

file:write("\r")

file:close()

local file = assert(io.open("test.txt","r"))

local str = file:read("*a")

print(str)

file:close()

輸出: 

io.read() 使用的引數和簡單i/o模型一樣

其他io操作:

不帶引數file:seek()則返回當前位置,file:seek("set")則定位到檔案頭,file:seek("end")則定位到檔案尾並返回檔案大小

file:flush():向檔案寫入緩衝中的所有資料

io.lines(optional file name):開啟指定的檔案filename為讀模式並返回乙個迭代函式,每次呼叫將獲得檔案中的一行內容,當到檔案尾時,將返回nil,並自動關閉檔案。

若不帶引數時io.lines() <=> io.input():lines(); 讀取預設輸入裝置的內容,但結束時不關閉檔案

錯誤有語法錯誤和執行錯誤

error函式

error(message [,number])

功能:終止正在執行的函式,並返回message的內容作為錯誤資訊(error函式永遠都不會返回)

通常情況下,error會附加一些錯誤位置的資訊到message頭部。

number引數指示獲得錯誤的位置:

示例:

local a = "lua"

local b

if not a then error("error! "..a.." is nil") end

print(a.." is a string")

if not b then error("error!",2) end

print(b)

輸出:

assert 函式

assert首先檢查第乙個引數,若沒問題,assert不做任何事情;否則,assert以第二個引數作為錯誤資訊丟擲。

示例: 

assert(type("lua")=="string","lua不是乙個string")

assert(io.open("lua.txt","r"),"檔案不存在!")

輸出: 

lua中處理錯誤,可以使用函式pcall(protected call)來包裝需要執行的**。

pcall接收乙個函式和要傳遞給後者的引數,並執行,執行結果:有錯誤、無錯誤;返回值true或者或false, errorinfo。

格式:

if pcall(函式名稱) then

--沒有錯誤的操作

else

--有錯誤的操作

end

pcall引數裡面也可以是匿名函式

簡單示例:

local a = "abc"

local b = 4

local c

if pcall( function() c=a+b end) then

print(c)

else

print("error")

end

輸出:

pcall以一種"保護模式"來呼叫第乙個引數,因此pcall可以捕獲函式執行中的任何錯誤。

通常在錯誤發生時,希望落得更多的除錯資訊,而不只是發生錯誤的位置。但pcall返回時,它已經銷毀了呼叫桟的部分內容。

lua提供了xpcall函式,xpcall接收第二個引數——乙個錯誤處理函式,當錯誤發生時,lua會在呼叫桟展開(unwind)前呼叫錯誤處理函式,於是就可以在這個函式中使用debug庫來獲取關於錯誤的額外資訊了。 

debug庫提供了兩個通用的錯誤處理函式:

例項:

function f(a,b)

return a + b

endfunction errorhandler(err)

print("error:",err)

endstatus = xpcall((function() print(f(5,4)) end),errorhandler)

print(status)

輸出:

如果最後呼叫的那行修改為:

status = xpcall((function() print(f("dasd",4)) end),function() print(debug.traceback()) end)
輸出 :

Lua基礎學習 Lua函式

函式主要用途 1 是作為呼叫語句使用。2 作為賦值語句的表示式使用。語法 區域性 全域性 function fun name 引數列表 函式體endfunction 定義函式關鍵字注意 1 在使用 lua 函式 變數時一定要先定義函式 變數 2 lua 函式不支援引數預設值,可以使用 or 解決。如...

Lua學習(五) 表

表 2 可以使用構造器來初始化表,表是lua特有的功能強大的東西。最簡單的建構函式是 用來建立乙個空表。3localdays 4 第乙個元素索引為1,以後的類推,這一點和其他語言的第乙個元素索引是0不同,要特別注意,小心掉到坑裡邊。5print days 4 lua 6 7 建構函式可以使用任何表示...

lua基礎知識五

lua物件導向 lua 中沒有類,那麼lua中的類可以通過table function模擬出來。table function 對於乙個物件來說 屬性 方法 人person.eat function print person.name.在吃飯 endfunction person.eat print ...