前言#
不知道大家在打印一些信息的時候遇沒遇到過這種奇怪的情況:明明打印了一堆信息但是最后幾條沒有顯示出來,或者說將調試信息輸出到文件,結果程序崩潰了,其中的信息比預想的內容要少一部分,其實這些缺少的信息就存放在“緩沖區”內,要想將這些信息完整顯示出來就需要用到我們今天所講的函數。
內容#
io.flush()##
- 原型:io.flush ()
- 解釋:把用戶程序中的緩沖區數據強制寫入到文件或內存變量并清空緩沖區。
io.flush()
是作用在默認的輸出文件描述符上,相當于io.output():flush()
,對于其他的通用文件可以使用file:flush()
或者io.flush(file)
。
file:setvbuf()
- 原型:file:setvbuf (mode [, size])
- 解釋:設置輸出文件緩沖區的模式,
mode
有以下三種方式可選:- "full":滿緩沖,沖區為空時,從流讀入數據。或當緩沖區滿時,向流寫入數據。
- "line":行緩沖,每次從流中讀入一行數據或向流中寫入—行數據。
- "no":無緩沖,直接從流中讀入數據或直接向流中寫入數據,而沒有緩沖區。
Usage##
- 首先新建一個文件,將文件命名為flushtest.lua然后編寫如下代碼:
-- 設置緩沖區之前正常輸出
print("before set setvbuf")
-- 設置緩沖類型
io.output():setvbuf("full", 16)
print("10 letters")
print("10 letters")
-- 注釋前后結果不同
io.output():flush()
-- 暫停程序
os.execute("pause")
- 運行結果
io_flush.png
總結#
- 首先這種情況在一般的小程序中不太會出現,我已我們必須模擬這種情況,這里我們主動使用函數
file:setvbuf()
函數來修改緩沖區大小,造成這種情況的出現。 - 對于
io.flush(file)
這種寫法我在文檔里沒有見到,不過我在Lua版本5.1.4上使用確實可以達到效果。 - 由結果可知當緩沖區大小設置成16的時候,不滿16的部分字符是不會被輸出的,但是當程序退出時緩沖區可以正常的清空輸出,加入在程序退出之前發生了異常,那么這部分字符就丟失了。
- 細心的朋友也許會發現不使用
io.flush()
函數的第一次輸出只有15個字符,其實這應該是print()
函數實現的時候尾部會加一個\n
的緣故,這個換行符也會占用緩沖區1個字符的位置。