为什么 Lua 函数 io.write() 不起作用?它只在终端上显示结果,而不是写入文件

我正在学习 Lua IO 库。我遇到了 io.write() 的问题。在《程序设计与 Lua》中,有一段代码逐行迭代文件,并在每行前面加上一个序号。 这是我正在工作的文件:

test file: "iotest.txt"

这是我的代码

io.input("iotest.txt")
-- io.output("iotest.txt")
local count = 0
for line in io.lines() do
    count=count+1
    io.write(string.format("%6d ",count), line, "\n")
end

这是终端显示的结果,但是这个结果无法写入文件,无论我是否添加 IO.Output(" iotest.txt ")。

在终端上的结果

这是文件的结果,我们可以看到没有改变

代码运行后的结果

点赞
用户11740758
用户11740758

写入文件需要用到文件句柄。

该句柄来自于:io.open()

请见:https://www.lua.org/manual/5.4/manual.html#6.8

文件句柄有用于自身的方法。

即在文件句柄后面的函数:

所以,io.write()输出到标准输出,而file:write()则输出到文件。

以下是一个可以将定义好的函数导出到文件的示例函数...

fdump=function(func,path)
assert(type(func)=="function")
assert(type(path)=="string")
-- 获取文件句柄(文件)
local file,err = io.open(path, "wb")
assert(file, err)
local chunk = string.dump(func,true)
file:write(chunk)
file:flush()
file:close()
return 'DONE'
end

下面是方法,来自于io.stdin

close = function: 0x566032b0
seek = function: 0x566045f0
flush = function: 0x56603d10
setvbuf = function: 0x56604240
write = function: 0x56603e70
lines = function: 0x566040c0
read = function: 0x56603c90

这使我们直接使用它变得可能,例如...

( Lua控制台:lua -i )

> do io.stdout:write('Input: ') local result=io.stdin:read() return result end
Input: d
d
2021-04-25 08:46:54
用户2858170
用户2858170

只需在写操作后添加 io.flush() 将数据保存到文件中。

io.input("iotest.txt")
io.output("iotestout.txt")
local count = 0
for line in io.lines() do
    count=count+1
    io.write(string.format("%6d ",count), line, "\n")
end
io.flush()
io.close()

请参考 Lua 5.4 参考手册:6.8 - 输入和输出设施

io.flush() 将保存您使用 io.output 设置的任何写入数据到输出文件。

在 koyaanisqatsi 的回答中,可以选择使用文件句柄。如果您同时处理多个文件,这将变得特别有用,并且可以更好地控制如何与文件交互。

话虽如此,您还应该针对输入和输出分别拥有不同的文件。您会同意交替地从同一个文件中读取和写入是没有意义的。

2021-04-25 08:51:52
用户1867654
用户1867654

错误信息

你试图同时以读写方式打开相同的文件。这是不允许的。

解决方法

以下有两种可能的解决方法:

  1. 从文件X中读取,遍历它并将结果写入另一个文件Y。
  2. 将完整文件X读入内存,关闭文件X,然后删除文件X,打开相同的文件名以写入并在原始文件(在内存中)遍历时写入。

除此之外,你的方法是正确的,尽管在Lua中文件操作更常使用io.open()和文件句柄而不是io.write()和io.read()。

2021-04-27 12:54:04