Lua IO 写入特定位置

如果我有foo.txt:

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

我应该如何编写一个 Lua 脚本来更改数字或动物,或向列表添加元素?我查看了 lua.io 的文档(http://www.lua.org/manual/5.3/manual.html#6.8),但仍然不知道如何在不每次编辑时重写整个行的情况下完成此操作。

点赞
用户734069
用户734069

作为基本的文件 IO 操作(也就是不仅限于 Lua),你不能向已经存在的文件中插入数据,只能覆盖数据或者添加数据。但你无法插入数据,让先前的数据被推至文件的更下层。

通常的处理方式是将文件保存在内存中,只有当用户保存数据时,才将整个文件写入。在内存中,文件就是一个字符串,你可以插入字符等等操作。

你可以通过读取后续的数据,回到你开始读取的位置,写入新的数据,然后再将你刚刚读取的数据写入。但人们通常只在必要的情况下才这样做。

2015-12-05 18:14:35
用户1847592
用户1847592
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]*)[^\r\n]*',
    '%1'..new_value, 1)
  -- 如果搜索后未找到键值,则在文件开头添加新的键值对
  if cnt == 0 then
    content = key..' = '..new_value..'\n'..content
  end
  -- 将修改后的内容写入文件
  file = assert(io.open(filespec, 'w'))
  file:write(content)
  -- 关闭文件
  file:close()
end

-- 在文件 foo.txt 中添加或更新键值对 'chicken': 13.5
add_or_update_data_in_file('chicken', 13.5, 'foo.txt')
2015-12-05 20:33:52