Lua io.flush()/file:setvbuf()

前言#

不知道大家在打印一些信息的時候遇沒遇到過這種奇怪的情況:明明打印了一堆信息但是最后幾條沒有顯示出來,或者說將調試信息輸出到文件,結果程序崩潰了,其中的信息比預想的內容要少一部分,其實這些缺少的信息就存放在“緩沖區”內,要想將這些信息完整顯示出來就需要用到我們今天所講的函數。

內容#


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個字符的位置。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • # 3.1 File # ## 3.1.1 File基本概念 ## 1.基本概念 -File類用于表示文件(目錄)...
    閆子揚閱讀 497評論 0 0
  • 概述: 1、IO流:即Input Output的縮寫。 2、特點:1)IO流用來處理設備間的數據傳輸。2)Java...
    玉圣閱讀 1,270評論 0 3
  • 之所以寫這個是因為Hadoop的IO與·這個類似 但要比這個深入,而且都還涉及到網絡傳輸原理的五個層次。所以,一...
    起個什么呢稱呢閱讀 1,054評論 0 6
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • CKEditor FCKeditor是一個專門使用在網頁上屬于開放源代碼的所見即所得文字編輯器。它志于輕量化,不需...
    博為峰51Code教研組閱讀 180評論 0 0