天天看點

lua程式設計第七章輸入輸出用法以及練習題答案

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

不能

繼續閱讀