io.write可以讀取任意數量的字元串,并将其寫入目前輸出流,由于可以使用多個參數,盡量避免使用io.write(a…b…c),應該調用io.write(a,b,c)
應該隻在"用後即棄"的代碼或調試代碼中使用函數print
io.write遵循一般的轉換規則,如果想要完全地控制這種轉換,一個使用string.format:
io.write("sin(3) = ", math.sin(3), "\n") -->sin(3) = 0.14112000805987
io.write(string.format("sin(3) = %.4f\n", math.sin(3)))
--> sin(3) = 0.1411
io.read可以從目前輸入流中讀取字元串
使用io.open來打開一個檔案,這個函數有兩個參數,一個參數是待打開檔案的檔案名,另一個參數是一個模式字元串
使用函數assert可以檢查錯誤
local f = assert(io.open(filename,mode))
如果函數io.open執行失敗,錯誤資訊會作為函數assert的第二個參數被傳入,之後函數assert會将錯誤資訊展示出來
io.tmpfile 傳回一個操作臨時檔案的句柄,該句柄以讀/寫模式打開。當程式運作結束後,臨時檔案自動移除
函數flush将所有緩沖資料寫入檔案,io.flush(),重新整理目前輸出流;f:flush(),重新整理流f
函數setvbuf用于設定流的緩沖模式,第一個參數是一個字元串,"no"表示無緩沖,"full"表示在緩沖區滿時或者顯式地重新整理檔案時才寫入資料,"line"表示輸出一直被緩沖直到遇到換行符,setvbuf支援第二個參數,用來指定緩沖區大小
函數seek用來擷取和設定檔案的目前位置,其中參數whence是一個指定如何使用偏移的字元串,當whence取值為"set"表示相對檔案開頭的偏移;"cur"表示相對于檔案目前位置的偏移;"end"表示相對檔案尾部的偏移.
函數os.rename用于檔案重命名,os.remove用于移除檔案,處理的是真實檔案而非流
os.exit用于終止程式的執行,os.getenv用于擷取某個環境變量
os.execute用于運作系統指令,等價于C語言中的函數system
練習7.1
function test(filename1, filename2)
if filename1 and filename2 then
local f = assert(io.open(filename1,"r"))
local t = f:read("a")
f:close()
local f1 = assert(io.open(filename2,"w"))
f1:write(t)
f1:close()
else if filename1 then
local f = assert(io.open(filename1,"r"))
local t = f:read("a")
f:close()
io.write(t)
else
t = io.read()
io.write(t)
end
end
end
test("hello.txt","areyouok.txt")
練習7.2
類似上面 加個判斷就行了
練習7.3
輸入檔案最大支援(2^31-1 = 2147483647位元組)
根據測試 性能最好的是按塊 其次到一次性讀取,在到按行,最慢的是按位元組
練習7.4
function test(filename)
local f = assert(io.open(filename,"r"))
local num = 0
f:seek("end")
repeat
f:seek("cur",-1)
local t = f:read(1)
num = f:seek("cur",-1)
until t == "\n" or num == 0
if num ~= 0 then
f:seek("cur",1)
end
local text = f:read("a")
f:close()
print(text)
end
test("hello.txt")
練習7.5
function test(filename,n)
n = n or 1
local f = assert(io.open(filename,"r"))
local num = 0
local count = 0
f:seek("end")
repeat
f:seek("cur",-1)
local t = f:read(1)
num = f:seek("cur",-1)
if t == "\n" then
count = count + 1
f:seek("cur",-1)
end
until count == n or num == 0
if num ~= 0 then
f:seek("cur",2)
end
local text = f:read("a")
f:close()
print(text)
end
test("hello.txt",2)
練習7.6
function createDir(path)
os.execute("mkdir "..path);
end
function deleteDir(path)
os.execute("rm -rf "..path);
end
function printdir(s)
local myfile = io.popen(s, "r")
if nil == myfile then
print("open file for dir fail")
end
for cnt in myfile:lines() do
print(cnt)
end
myfile:close()
end
練習7.7
不能