4
A
回答
2
此解决方案基于@PaulKulchenko的想法。
是的,这是很麻烦:-)
在io
库定义功能io.linesbackward(filename)
:
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
用法:
1
不使用标准库。但是,您可以始终通过线条从头到尾阅读它,将其存储在表格中,然后从最后一行“使用”到第一行。
4
这是可能的,但麻烦。 Lua API提供了函数来设置和获取读/写操作适用的文件中的位置。因此,您可以使用“seek”从最后一小块读取文件(例如,寻找filesize-1024
位置,读取1024
字节,查找所有行尾,打印完整行并存储剩下的),并继续这样做,回到文件的开头。主要优点是你不应该花费比你正在阅读的缓冲区多得多的内存(就像你从一开始就阅读,但是想以相反的顺序打印,你需要把整个文件放在内存中),但可能会很慢。
相关问题
- 1. 是否可以读取锁定文件?
- 2. 是否可以读取.exe文件?
- 3. 是否可以使用Perl读取pdf文件中的文本?
- 4. 使用xdocreport,是否可以从docx文件读取图形?
- 5. 是否可以使用Chainsaw读取日志文件?
- 6. 是否可以使用Java来读取位图文件头?
- 7. 是否可以使用JAVA从文件中读取/写入位?
- 8. 是否可以使用Ruby读取文件的修改日期?
- 9. 是否可以使用FileReader从文件读取?
- 10. 是否可以使用Actionscript只读取文件的第一行?
- 11. 是否可以使用PHPWord读取MSWORD?
- 12. 用c读取Lua文件#
- 13. Lua读取只读文件
- 14. 使用lua读取文件元数据
- 15. 使用lua读取pcap文件
- 16. 使用LUA读取和解析文件
- 17. 是否可以将PDF文件作为txt文件读取?
- 18. 是否可以使用python suds从文件系统中读取wsdl文件?
- 19. 是否可以使用python shell读取Python文件的文件字符串?
- 20. 是否可以使用Javascript从网络文件系统读取文件?
- 21. 是否可以使用JavaScript从txt文件读取/写入文件?
- 22. Groovy向后读取文件
- 23. SAS - 向后读取文件?
- 24. 检查文件是否可以用Python读取:try或if/else?
- 25. 的Lua:读取文件
- 26. 是否可以同时读写文件?
- 27. 是否可以使用SRdd读取1 GB以上的NetCDF文件?
- 28. 是否可以使用PHP读取邮件?
- 29. 是否可以读取文本文件并进行检查?
- 30. 是否可以使用Labview编写/读取文本文件的元数据?
完全向后,让你获得 'sdrawkcab'?或者只是最后一行显示? –
是否需要O(n)时间复杂度? –
@MarcB最后一行首先显示 – fishy