Lua读取文件内容后调用io.read()无法获取用户输入如何解决
问题根因
死循环是两个逻辑错误共同导致的:
- 调用
io.input("script.txt")会把Lua全局默认输入流重定向到script.txt文件,后续执行io.close()仅会关闭这个文件句柄,不会自动把默认输入流切回控制台标准输入。之后执行io.read("*n")时,程序不会等待用户的控制台输入,会直接返回nil,until input ~= nil的退出条件永远无法满足,就会反复打印提示进入死循环。 - 你将
print重定义为io.write后,输出默认走缓冲区,之前尝试io.flush()没有效果,本质是输入源本身就错了,刷新输出解决不了输入流指向错误的核心问题。
修复方案
不要用修改全局默认IO流的方式读文件,改用独立文件句柄操作,就不会干扰后续控制台输入逻辑,对应代码修改如下:
文件读取段修正
local oldprint = print local print = io.write -- 单独打开文件句柄读取,不修改全局输入流 local script_file = io.open("script.txt", "r") local script = script_file:read("*all") script_file:close()
控制台输入段修正
如果遇到提示文字不立刻显示的问题,在打印提示后加io.flush()强制刷新输出缓冲即可;也可以显式指定从标准输入读取内容,彻底避免全局流被意外篡改的问题:
local functions = { [","] = function() local input repeat print("\nAwaiting input... (must be a number)\n") io.flush() -- 强制刷新输出,保证提示即时显示 -- 显式指定从控制台标准输入读取,不依赖全局默认流 input = io.stdin:read("*n") until input ~= nil array[pointer] = input print(stringy) end } functions[","]()
如果你一定要用
io.input()的方式改全局流,记得关闭文件后显式执行io.input(io.stdin)把默认输入流切回控制台。但更推荐始终用独立句柄操作外部文件,不要随意修改全局IO默认配置,能规避绝大多数无厘头的IO冲突问题。
内容的提问来源于stack exchange,提问作者aadenboy
相关产品推荐
相关产品推荐

