是否可以读取文件"向后"用Lua?

时间:2016-06-21 15:42:23

标签: lua

不是从前面读取文件,而是可以向后读取它吗?这样输出就是从文件的后面到文件的前面。

编辑:最后一行显示,而不是完全向后显示。

3 个答案:

答案 0 :(得分:4)

这是可能的,但很麻烦。 Lua API提供seek函数来设置和获取读/写操作适用的文件中的位置。

所以,你可以使用"寻找"从末尾以小块读取文件(例如,寻找filesize-1024位置,读取1024个字节,找到所有行尾,打印完整行并存储剩余部分)并继续这样做会回到文件的开头。主要的优点是你不应该花费比你正在阅读的缓冲区更多的内存(就像你从头开始阅读,但想要以相反的顺序打印,你需要拥有整个文件在内存中),但它可能很慢。

答案 1 :(得分:2)

此解决方案基于@PaulKulchenko的想法 是的,这很麻烦:-)

io.linesbackward(filename)库中定义函数io

function io.linesbackward(filename)
  local file = assert(io.open(filename))
  local chunk_size = 4*1024
  local iterator = function() return "" end
  local tail = ""
  local chunk_index = math.ceil(file:seek"end" / chunk_size)
  return 
    function()
      while true do
        local lineEOL, line = iterator()
        if lineEOL ~= "" then 
          return line:reverse() 
        end
        repeat
          chunk_index = chunk_index - 1
          if chunk_index < 0 then 
            file:close()
            iterator = function() 
                         error('No more lines in file "'..filename..'"', 3) 
                       end  
            return 
          end
          file:seek("set", chunk_index * chunk_size)
          local chunk = file:read(chunk_size)
          local pattern = "^(.-"..(chunk_index > 0 and "\n" or "")..")(.*)"
          local new_tail, lines = chunk:match(pattern)
          iterator = lines and (lines..tail):reverse():gmatch"(\n?\r?([^\n]*))"
          tail = new_tail or chunk..tail
        until iterator
      end
    end
end

用法:

local filename = "your_file.txt"
print("--- backward: ---------------------------")
for line in io.linesbackward(filename) do
  print(line)
end
print("--- forward: ----------------------------")
for line in io.lines(filename) do
  print(line)
end
print("-----------------------------------------")

答案 2 :(得分:1)

不使用标准库。但是你总是可以通过线条从头到尾阅读它,将它存储在表格中,然后使用&#34;使用&#34;它从最后一行到第一行。