簡單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 ...