ruby - 为什么我必须 .read() 一个我写的文件,然后才能将内容实际输出到终端?

标签 ruby

我正在学习 Ruby,现在正在搞乱读写文件。当我创建文件“filename”时,我可以使用 .write() 方法写入它。但是,如果在终端上运行 .read() 后不重新打开它,我就无法将内容输出到终端(参见第 8 行:puts write_txt.read())。我试过多次运行第 8 行,但所做的只是输出更多的空行。如果没有第 8 行,puts txt.read() 只会输出一个空行。下面的代码在第 8 行没有 puts 的情况下也可以工作(只是 write_txt.read())

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")
# This outputs a blank line THIS IS THE LINE IN QUESTION
puts write_txt.read()

txt = File.open(filename)
# This actually outputs the text that I wrote
puts txt.read()

为什么这是必要的?为什么明明写入的文件至少读取一次为空白,直到重新打开后,才被读取为空白?

最佳答案

当您读取或写入文件时,有一个称为“游标”的内部指针会跟踪您当前在文件中的位置。当你写一个文件时,光标被设置到你写的最后一个字节之后的点,所以如果你执行额外的写,它们发生在你之前的写之后(而不是在它之上)。当您执行读取时,您正在从当前位置读取到文件末尾,其中包含……什么都没有!

您可以打开一个文件(光标位置 0),然后写入字符串“Hello”(光标位置 6),并尝试从光标读取将导致 Ruby 说“哦,嘿,这个文件中没有更多内容越过光标位置 6",将只返回一个空字符串。

您可以使用 IO#rewind 将文件光标倒回,以将光标重置到文件的开头。然后您可以正常读取文件(将从光标读取到文件末尾)。

请注意,如果您在倒带后执行任何写入操作,您将覆盖之前写入的内容。

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")

write_txt.rewind
puts write_txt.read()

但是请注意,读取和写入同一个文件句柄通常被认为是不好的做法。您通常会打开一个文件句柄进行读取,一个文件句柄用于写入,因为将两者混合使用会产生严重的后果(例如通过倒带读取光标意外覆盖现有内容,然后执行写入!)

关于ruby - 为什么我必须 .read() 一个我写的文件,然后才能将内容实际输出到终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063559/

相关文章:

ruby - 按长度重新排列 FASTA 格式文件中的序列?

ruby - 如何使用要在倒排索引中使用的正则表达式匹配 Ruby 中的多行字符串?

javascript - "respond_to do |format|"抛出 UnknownFormat 错误

ruby-on-rails - 尝试安装 Rails (OSX) 时出现权限错误

ruby-on-rails - ruby on rails 如何将 http 请求映射到处理函数?

ruby - 使用 ruby​​ curb gem 访问 paypal api

ruby - Nokogiri 和 Mechanize 问题

ruby - 如果我想要 HTML 输出,如何使用 Nokogiri 向某些文本添加 a'href' 标签?

Ruby - 替换中间行中的字符?

ruby - 无法打开到 127.0.0.1 的 TCP 连接 :9516 (connection refused)