由于某些原因,我必须在文件中找到最后一行的开头,到目前为止我已经这样做了:
file.seek(-1,IO::SEEK_END)
while file.getc != "\n"
file.seek(-2,IO::SEEK_CUR)
end
这是另一种方式,但速度要慢得多:
buff = file.readlines
file.seek(-(buff.pop).length,IO::SEEK_END)
有没有其他方法可以做到这一点?
您可以使用找到文件中所有行末端的位置
offsets = f.each.map { f.tell }
很明显,最后一行的开头是倒数第二行的结尾,即offsets[-2]
.
因此,为了加快速度,您需要做的就是首先seek
距离结束足够远,以至于您一定会超过最后一行的开头,然后以相同的方式获取列表。
假设您的行都保证长度小于 80 个字符:
open('myfile') do |f|
f.seek(-80, IO::SEEK_END)
offsets = f.each.map { f.tell }
puts offsets[-2]
end
或者,如果您对文件中行的长度知之甚少,您可以迭代,直到您发现捕获了两个或更多行结尾。此代码从文件末尾每次后退 80 个字符,直到offsets
有两个或更多条目。
open('myfile') do |f|
start = 0
offsets = []
loop do
start -= 80
f.seek(start, IO::SEEK_END)
offsets = f.each.map { f.tell }
break if offsets.size >= 2
end
puts offsets[-2]
end
请注意,有一些特殊的边界情况:
IO
如果您尝试寻找文件的开头,将引发错误
如果你的文件只有一行,那么你想要的值是零,但是这个算法永远不会找到它