Aly
Aly

Reputation: 16255

Ruby: overwrite line in file

I am trying to log some state to a file using standard file i/o in ruby. The file will just have one line with a number in it. I want to read in the line and then on each iteration of a loop I want to update this number.

I know I can read in the file with

file = File.open('out.log', 'a+')
num = file.readline

The problem is, I don't know how to then overwrite the first line in a loop without just re-opening the file every iteration i.e.

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

which will create an empty file

Upvotes: 1

Views: 2073

Answers (2)

Arup Rakshit
Arup Rakshit

Reputation: 118261

You can use IO::open with block to close the file, when block exits automatically.

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

Upvotes: 1

astreal
astreal

Reputation: 3513

No need to open it each time:

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

Upvotes: 3

Related Questions