前言#
不知道大家在打印一些信息的時候遇沒遇到過這種奇怪的情況:明明打印了一堆信息但是最后幾條沒有顯示出來衫贬,或者說將調(diào)試信息輸出到文件马僻,結(jié)果程序崩潰了,其中的信息比預(yù)想的內(nèi)容要少一部分睁壁,其實這些缺少的信息就存放在“緩沖區(qū)”內(nèi)寒屯,要想將這些信息完整顯示出來就需要用到我們今天所講的函數(shù)巍棱。
內(nèi)容#
io.flush()##
- 原型:io.flush ()
- 解釋:把用戶程序中的緩沖區(qū)數(shù)據(jù)強(qiáng)制寫入到文件或內(nèi)存變量并清空緩沖區(qū)惑畴。
io.flush()
是作用在默認(rèn)的輸出文件描述符上,相當(dāng)于io.output():flush()
航徙,對于其他的通用文件可以使用file:flush()
或者io.flush(file)
如贷。
file:setvbuf()
- 原型:file:setvbuf (mode [, size])
- 解釋:設(shè)置輸出文件緩沖區(qū)的模式,
mode
有以下三種方式可選:- "full":滿緩沖到踏,沖區(qū)為空時杠袱,從流讀入數(shù)據(jù)∥迅澹或當(dāng)緩沖區(qū)滿時楣富,向流寫入數(shù)據(jù)。
- "line":行緩沖伴榔,每次從流中讀入一行數(shù)據(jù)或向流中寫入—行數(shù)據(jù)纹蝴。
- "no":無緩沖,直接從流中讀入數(shù)據(jù)或直接向流中寫入數(shù)據(jù)踪少,而沒有緩沖區(qū)塘安。
Usage##
- 首先新建一個文件,將文件命名為flushtest.lua然后編寫如下代碼:
-- 設(shè)置緩沖區(qū)之前正常輸出
print("before set setvbuf")
-- 設(shè)置緩沖類型
io.output():setvbuf("full", 16)
print("10 letters")
print("10 letters")
-- 注釋前后結(jié)果不同
io.output():flush()
-- 暫停程序
os.execute("pause")
- 運行結(jié)果
總結(jié)#
- 首先這種情況在一般的小程序中不太會出現(xiàn)援奢,我已我們必須模擬這種情況兼犯,這里我們主動使用函數(shù)
file:setvbuf()
函數(shù)來修改緩沖區(qū)大小,造成這種情況的出現(xiàn)。 - 對于
io.flush(file)
這種寫法我在文檔里沒有見到切黔,不過我在Lua版本5.1.4上使用確實可以達(dá)到效果砸脊。 - 由結(jié)果可知當(dāng)緩沖區(qū)大小設(shè)置成16的時候,不滿16的部分字符是不會被輸出的纬霞,但是當(dāng)程序退出時緩沖區(qū)可以正常的清空輸出脓规,加入在程序退出之前發(fā)生了異常,那么這部分字符就丟失了险领。
- 細(xì)心的朋友也許會發(fā)現(xiàn)不使用
io.flush()
函數(shù)的第一次輸出只有15個字符侨舆,其實這應(yīng)該是print()
函數(shù)實現(xiàn)的時候尾部會加一個\n
的緣故,這個換行符也會占用緩沖區(qū)1個字符的位置绢陌。