如何在Ruby中读取已写入的文件
如何在Ruby中读取已写入的文件
当我运行以下代码,该代码取自Learn Ruby the Hard Way 课程练习16时,
filename = ARGV.first target = open(filename, 'w+') 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 + "\n" + line2 + "\n" + line3) puts "And now I'm going to print the file to prove I have altered it." puts target.read puts "And finally, we close it." target.close
即使文本文件发生了更改,puts target.read
这一行并不打印出三个输入行。
我尝试改变open
方法使用的模式,并在调用read
方法之前添加一个新的open
方法。创建一个独立的程序,使用相同的脚本来读取和打印文本文件时,正常工作。
我如何读取刚刚写入的文件?为什么在同一个程序中写入和读取时不起作用?
为什么在同一个程序中写入和读取文件时会出现问题?
答案是,当你向文件写入内容时,IO流会被设置到你写入的结尾位置。当你进行读取操作时,它会从这个位置继续。在这种情况下,写入后,你已经到达文件的结尾,没有其他内容可以“读取”。你可以使用IO#rewind将流重新回滚到开头,并通过IO流输出刚刚写入的内容。
filename = 'Test.txt' target = open(filename, 'w+') text = '12345' target.write(text) # target指向EOF puts "现在我要将文件倒回到开头" puts target.rewind # 回到文件开头 # => 0 puts "现在我要输出文件来证明我已经将其倒回到开头" puts target.read # 读取文件,target现在指向EOF # => '12345' target.close
在上述代码中,我们首先打开一个文件,并将内容写入文件中。然后,我们使用`target.rewind`将IO流重置到文件的开头,并使用`target.read`读取文件的内容。最后,我们关闭文件。这样,我们就可以在同一个程序中正确地写入和读取文件了。
问题的原因是如何在文件被写入后读取它。解决方法是使用Ruby的File类和相应的方法来打开和读取文件。下面是一种解决方法:
File.open("my/file/path", "r") do |f| f.each_line do |line| puts line end end
上述代码中,我们使用`File.open`方法打开文件并传入文件路径和打开模式("r"表示只读)。然后,我们使用`each_line`方法遍历文件的每一行,并使用`puts`语句打印每一行的内容。
另一种解决方法是在代码块结束后显式关闭文件。代码如下:
f = File.open("my/file/path", "r") f.each_line do |line| puts line end f.close
上述代码中,我们首先使用`File.open`方法打开文件并将其赋值给变量`f`,然后进行读取操作。最后,我们使用`close`方法显式关闭文件。
,我们可以使用Ruby的File类和相关方法来读取在文件被写入后的内容。我们可以使用`File.open`方法打开文件并传入文件路径和打开模式,然后使用相应的方法来读取文件的内容。如果需要的话,我们可以在代码块结束后显式关闭文件。