用Ruby读取文件的前一行

用Ruby读取文件的前一行,ruby,io,Ruby,Io,如何读取文件的前一行。与IO.gets相反,我最初想将IO.lineno设置为我想要读取的行号,但这并没有达到预期效果。你实际上是如何阅读上一行的?有两种方法,这取决于你掌握了多少信息。 如果你知道你读到的最后一行的长度,你可以采取最简单的方法 # assume f is the File object len = last_line_length f.seek -len, IO::SEEK_CUR 当然,如果没有提供信息,事情会变得不那么美好。您可以使用与上面相同的方法向后走(一次一个字节)

如何读取文件的前一行。与IO.gets相反,我最初想将IO.lineno设置为我想要读取的行号,但这并没有达到预期效果。你实际上是如何阅读上一行的?

有两种方法,这取决于你掌握了多少信息。 如果你知道你读到的最后一行的长度,你可以采取最简单的方法

# assume f is the File object
len = last_line_length
f.seek -len, IO::SEEK_CUR
当然,如果没有提供信息,事情会变得不那么美好。您可以使用与上面相同的方法向后走(一次一个字节),直到碰到换行标记,或者从一开始就读取
lineno
。差不多

lines = f.lineno
f.rewind
(lines - 1).times { f.gets }
然而,据我所知,没有直接的机制只返回1n,其中
N
表示一条线


另一方面,您应该知道,虽然您可以写入
File.lineno
,但这样做实际上不会影响文件中的位置,而且还会破坏该点之后读取变量的准确性

一个简单的方法是记住你读到的前一行:

prev = nil
File.foreach('_vimrc') do |line|
  p [line, prev]  # do whatever processing here
  prev = line
end

在上看到了一个很好的建议--使用IO.tell跟踪文件中每一行的位置,以便您可以直接查找它:

File.open "foo" do |io|
  idx = [io.tell]
  while l = io.gets
    p l
    idx << io.tell
  end
end 
File.open“foo”do | io|
idx=[io.tell]
而l=io.get
PL
idxgem有一个get方法,它与IO.get相反

$sudo gem安装elif

$irb


我在comp.lang.ruby上也看到了这个问题——如果你在那里得到了一个好的答案,请做一个好公民并更新这个页面。
require "elif"
last_syslog = Elif.open('/var/log/syslog') { |file| file.gets }