前言#
不知道大家在打印一些信息的时候遇没遇到过这种奇怪的情况:明明打印了一堆信息但是最后几条没有显示出来,或者说将调试信息输出到文件,结果程序崩溃了,其中的信息比预想的内容要少一部分,其实这些缺少的信息就存放在“缓冲区”内,要想将这些信息完整显示出来就需要用到我们今天所讲的函数。
内容#
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")
- 运行结果
总结#
- 首先这种情况在一般的小程序中不太会出现,我已我们必须模拟这种情况,这里我们主动使用函数
file:setvbuf()
函数来修改缓冲区大小,造成这种情况的出现。 - 对于
io.flush(file)
这种写法我在文档里没有见到,不过我在Lua版本5.1.4上使用确实可以达到效果。 - 由结果可知当缓冲区大小设置成16的时候,不满16的部分字符是不会被输出的,但是当程序退出时缓冲区可以正常的清空输出,加入在程序退出之前发生了异常,那么这部分字符就丢失了。
- 细心的朋友也许会发现不使用
io.flush()
函数的第一次输出只有15个字符,其实这应该是print()
函数实现的时候尾部会加一个\n
的缘故,这个换行符也会占用缓冲区1个字符的位置。