Linux:Lua 中的 tput cup 行为奇怪

os.execute('tput clear')    --清空终端
os.execute('tput cup 2 9')  --将光标移动到第2行,第9列
io.write('A')               --在光标位置写入'A'
os.execute('tput cup 8 2')  --将光标移动到第8行,第2列
io.write('B')               --在光标位置写入'B'

但是,由于某种原因,它会在第二个光标位置(第2列,第8行)打印这两个字符。当我使用print()代替io.write()时,它会将两个字符打印在它们的正确位置上。显然,我不想使用print(),那么我该如何使用io.write()将这两个字符串写入它们的正确位置?

点赞
用户2371334
用户2371334

你确实需要调用 io.flush()。@lhf 给出了正确的建议。但是关键是,你需要在代码的 正确位置 上使用它。

os.execute('tput clear')    --清空终端
os.execute('tput cup 2 9')  --将光标移动到第 2 行,第 9 列
io.write('A')               --在光标位置写入 'A'
io.flush()                  --*** 这是缺失的部分
os.execute('tput cup 8 2')  --将光标移动到第 8 行,第 2 列
io.write('B')               --在光标位置写入 'B'

输出将发送到终端,有两个程序竞争写入终端:Lua 和 tput。前两个调用 io.execute('tput') 立即写入终端。对 io.write() 的调用将字母'A'放在Lua的内部输出缓冲区中。在执行下一个对 io.execute('tput') 的调用之前,我们必须强制此缓冲输出到终端。

通常,在调用任何需要写入相同输出流的外部程序之前,应刷新程序的输出缓冲区。否则,输出缓冲可能导致输出流中的内容乱序出现。

2014-03-06 18:30:26