Ruby:覆盖文件中的行

Ruby: overwrite line in file

我正在尝试使用 ruby 中的标准文件 i/o 将一些状态记录到文件中。该文件将只有一行,其中包含一个数字。我想在行中阅读,然后在循环的每次迭代中我想更新这个数字。

我知道我可以使用

读取文件
file = File.open('out.log', 'a+')
num = file.readline

问题是,我不知道如何覆盖循环中的第一行,而不是每次迭代都重新打开文件,即

file = File.open('out.log', 'w')

这将创建一个空文件

无需每次都打开:

file = File.open('out.log', File::RDWR)
10.times do |i|
    file.seek(0) # rewind to the beginning of the file (line in your case)
    file.write("iteration #{i}") # write what you want

    # the following is just in order to show what was written
    file.seek(0)
    puts file.readline
end
file.close

您可以使用 IO::open with block 来关闭文件,当 block 自动退出时。

File.open("#{__dir__}/test.txt", File::RDWR) do |file|
  10.times do |i|
    file.rewind
    file.puts("iteration #{i}")
  end
end

puts File.read("#{__dir__}/test.txt")
# >> iteration 9