我正在学习 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/