2

由于某些原因,我必须在文件中找到最后一行的开头,到目前为止我已经这样做了:

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)

有没有其他方法可以做到这一点?

4

1 回答 1

1

您可以使用找到文件中所有行末端的位置

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如果您尝试寻找文件的开头,将引发错误

  • 如果你的文件只有一行,那么你想要的值是零,但是这个算法永远不会找到它

于 2013-08-02T12:20:38.860 回答