关于文件 io:lua io 写入特定位置

lua io writing to specific postion

如果我有

foo.txt:

1
2
3
4
cows    = 3
sheep   = 2
chicken = 14
dogs    = 1

我如何编写一个可以更改数字或动物或将元素添加到列表中的 lua 脚本,我查看了 io 上的 lua 文档(http://www.lua.org/manual/5.3/manual. html#6.8),但我仍然不知道如何做到这一点而不做一些愚蠢的事情,比如每次编辑时都重写整行。


作为基本的文件 IO 操作(即不限于 Lua),你不能在已经存在的文件中间插入东西。您可以覆盖数据。您可以附加数据。但是您不能插入数据,这样以前的数据就会在文件中被推到更远的位置。

一般来说,您处理此问题的方式是将文件保存在内存中,然后在用户说要保存数据时写入整个内容。虽然它在内存中,但它只是一个字符串。因此,您可以执行插入字符等操作。

您可以通过读取所有其余数据来制造插入操作,返回您开始读取的位置,写入新内容,然后写入您刚刚读取的其余数据。但除非绝对必要,否则人们通常不会这样做。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function add_or_update_data_in_file(key, new_value, filespec)
  local file = assert(io.open(filespec))
  local content = file:read'*a'
  file:close()
  content, cnt = content:gsub(
    '(%f[%C]%s*'..key..'%s*=[ \\t]*)[^\
\
]*'
,
    '%1'..new_value, 1)
  if cnt == 0 then
    content = key..' = '..new_value..'\
'
..content
  end
  file = assert(io.open(filespec, 'w'))
  file:write(content)
  file:close()
end

add_or_update_data_in_file('chicken', 13.5, 'foo.txt')