如何用正确的代码将文件的前10行读入Lua表中?

我正在学习Lua,我的书(《Lua程序设计》)中有一些代码“读取文件的前10行:”

a = {}
for i=1,10 do
    a[#a+1] = io.read()
end

我真的不理解这个;这不是读取了十个nil值吗?能有人解释一下吗?

点赞
用户1201210
用户1201210

简短版本:这归结于 io.input 是否在问题中未列出的代码中更早地被调用。如果调用了它,它将打印该文件的前10行(在下面详细解释)。如果之前没有调用过它,并且您正在从命令行或交互式运行代码,则会在代码执行一次后打印您在控制台输入的前10行。对于其他情况,则取决于如何启动应用程序。

对于 io.readLua 5.1 参考手册说:

io.read (···)

等同于 io.input():read。

io.input 的文档则说:

当给定文件名时,它会在文本模式下打开指定的文件,并将其句柄设为默认输入文件。当使用文件句柄调用它时,它会将该文件句柄设置为默认输入文件。当不带参数调用它时,它会返回当前默认输入文件。[...]

而调用 io.input() 返回的对象是 file,调用 file.readfileio.input() 返回的对象)的文档说:

根据给定的格式读取文件 _file_。格式说明要读取什么。对于每个格式,该函数返回一个包含读取的字符(或数字)的字符串,如果不能用指定格式读取数据,则返回 nil。当不带格式调用它时,它使用默认格式,即读取整个下一行。[...]

因此有两种可能性:

  • 先前使用参数调用了 io.input(问题中未显示的某些代码),设置了默认输入文件。使用无参数调用 io.read 将返回该输入文件的“默认格式”,即“整个下一行”。
  • 先前未使用参数调用 io.input(如果没有其他代码,则这是真的)。使用无参数调用 io.read 将返回标准输入的“整个下一行”,例如如果程序从命令行运行,它将返回用户的命令行输入。

在第一种情况下,在读取完文件的所有行后,io.read() 将返回 nil。这可能意味着读取了10个 nil 实例,但这取决于文件。

在第二种情况下,如果标准输入用尽,则将返回 nil,这可能会以不同的方式发生,具体取决于应用程序的启动方式。这也可能意味着10个 nil 实例。

2012-09-30 23:50:20