io - 如何让lua按顺序运行

标签 io lua buffer

我正在通过 this site 学习 Lua .我在教程的最开始,正在尝试这个程序(输入一个数字, x ,它返回 x! ):

-- defines a factorial function
function fact (n)
  if n == 0 then
    return 1
  else
    return n * fact(n-1)
  end
end

print("enter a number:")
a = io.read("*number")  -- read a number
print(fact(a))

但是,当我运行它时,io.read似乎出现在提示之前。我在 Notepad++ 控制台中运行它,如下所示:
"C:\Program Files\Lua\5.1\lua.exe" "Path\To\factorial.lua"

输出(似乎)是空白的,但如果我输入一个数字,该函数就会运行。
5
enter a number:
120

虽然这在这里不是什么大问题,但我只能想象在创建之前使用变量会带来的问题。那么,我怎样才能让这个程序在读取输入之前提示输入一个数字呢?

最佳答案

发生的事情不是代码运行不正常,而是提示没有立即显示在终端上。

在内部,您输出的任何内容都由操作系统存储在 IO 缓冲区中。缓冲区会定期清空,其内容会显示在终端上(已刷新)。在大多数系统上,终端默认是行缓冲的,这意味着每次你写一个行尾字符 - 其中 print()自动执行 - 它被刷新;然而,在某些系统上,它默认为完全缓冲,这意味着只有在填满时才会自动刷新。

有两种方法可以解决这个问题。如果您想禁用或更改文件上所有 IO 操作的缓冲(出于这些目的,终端算作一个文件),您可以使用 file:setvbuf() 功能;特别是,io.output():setvbuf("no")将禁用标准输出的缓冲,这意味着您编写的任何内容都将立即显示。您也可以使用 io.output():setvbuf("line")在支持行缓冲但不是默认值的系统上启用行缓冲。

另一种方法是手动刷新缓冲区,这在您希望立即显示某些特定输出但不想普遍禁用输出缓冲时很有用。您可以使用 file:flush() 执行此操作函数,它立即刷新缓冲区,例如:

-- no newline, so even on line-buffered systems this may not
-- display immediately
io.write("Enter a number: ")
-- so we force it to
io.flush()

请注意 io.write() io.flush() 只是 io.output():write() 的便利功能和 io.output():flush() ,即他们获取当前输出文件,然后调用 :write():flush()在他们。

(为什么要费心去缓冲?因为它更快 - 将数据写入终端或文件是昂贵的,并且写一个大的东西比写很多小东西要快。在大多数情况下,如果事情不重要并不重要' t 在代码运行的那一刻就被写入,因此操作系统将要写入的数据保存在缓冲区中,然后在缓冲区填满时进行一次大写。)

关于io - 如何让lua按顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19367394/

相关文章:

c - 缓冲 io 和非缓冲 io 之间的区别

io - kqueue() 和 O_NONBLOCK

lua - 如何将多个值返回到表中?不返回表 [lua]

java - glReadPixels 返回的数据比预期多

c - 在lua中写一个函数(包含按位运算)

使用迭代器的 Lua 迭代器

即使在缓冲区完全填满之前,C 中已满缓冲的输出流是否可以自动刷新?

C# 高级控制台 I/O

c# - 为什么 MemoryStream 不提供采用 "long"容量的构造函数?

Java 8 FilterOutputStream 异常