这是我的代码:
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吗?我需要使用同花顺吗?
阅读和关闭后我也应该使用括号吗?这个例子没有。
答案 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 }