在相同的脚本中写入后读取文件(Ruby the Hard Way ex16)

时间:2015-04-12 21:05:45

标签: ruby

这是我的代码:

filename = ARGV.first

puts "We're gong to erase #{filename}"
puts "If you don't want that, hit CTRL-C (^C)."
puts "If you do want that, hit RETURN."

$stdin.gets

puts "Opening the file..."
target = open(filename, 'w')

puts "Truncating the file. Goodbye!"
target.truncate(0)

puts "Now I'm going to ask you for three lines."

print "line 1: "
line1 = $stdin.gets.chomp
print "line 2: "
line2 = $stdin.gets.chomp
print "line 3: "
line3 = $stdin.gets.chomp

puts "I'm going to write these to the file."

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")


print target.read
puts "And finally, we close it."


target.close

我试图让它写,然后阅读。如果我在脚本底部再次执行target.close然后target = open(filename),则此功能正常。还有另一种方式吗?

我看到有关python的this帖子,说明你在写入文件后需要关闭文件。这同样适用于Ruby吗?我需要使用同花顺吗?

阅读和关闭后我也应该使用括号吗?这个例子没有。

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题。您可以,正如您所做的那样,打开文件进行写入,写入,关闭文件,然后重新打开以进行阅读。这可以。关闭文件会将其刷新到磁盘并重新打开它将使您回到文件的开头。

或者,您可以打开文件进行读取和写入,并在文件中手动移动,就像编辑器中的光标一样。执行此操作的选项在IO.new中定义。

您的代码存在问题。

target.write("\n")

print target.read

此时您已写入该文件。 target文件指针指向文件的末尾,就像编辑器中的光标一样。当你target.read它要读取文件的结尾时,你什么也得不到。您必须先使用rewind返回文件的开头。

target.write("\n")
target.rewind
print target.read

您还必须打开文件进行读写。 w+可以执行此操作,并为您截断文件。

puts "Opening the file..."
target = File.open(filename, 'w+')

这是一种高级技术,通常在整个读写过程中对文件进行锁定时非常有用,以确保其他人无法在文件上工作。通常,当您阅读和写作时,您会这样做。例如,如果您想要读取文件中的计数器然后递增并确保没有人可以在其间写入。

def read_and_update_counter
  value = 0

  # Open for reading and writing, create the file if it doesn't exist
  File.open("counter", File::RDWR|File::CREAT, 0644) {|f|
    # Get an exclusive lock to prevent anyone else from using the
    # file while we're updating it (as long as they also try to flock)
    f.flock(File::LOCK_EX)

    # read the value
    value = f.read.to_i

    # go back to the beginning of the file
    f.rewind

    # Increment and write the new value
    f.write("#{value + 1}\n")

    # Flush the changes to the file out of the in-memory IO cache
    # and to disk.
    f.flush

    # Get rid of any other garbage that might be at the end of the file
    f.truncate(f.pos)
  }
  # File.open automatically closes the file for us    

  return value
end

3.times { puts read_and_update_counter }