打开和关闭文件
虽然一些标准方法会自动打开和关闭文件,但在处理文件内容时,你需要显式的打开和关闭文件。你可以使用 new
或 open
方法打开文件。你必须将两个参数传递给其中一个方法 - 文件名和文件 ‘mode’ - 同时将返回一个新的 File 对象。文件模式(modes)可以是由操作系统指定的常量或字符串所定义的整数。该模式通常指示文件是打开以进行读取(’r’),写入(’w’)还是读取和写入(’rw’)。这是可用字符串模式的列表:
Mode | Meaning |
---|---|
“r” | 只读,从文件开头开始(默认模式)。 |
“r+” | 读写,从文件开头开始。 |
“w” | 只写,将现有文件截断为零长度或创建用于写入的新文件。 |
“w+” | 读写,将现有文件截断为零长度或创建新文件以进行读写。 |
“a” | 只写,如果文件存在则从文件末尾开始,否则创建一个用于写入的新文件。 |
“a+” | 读写,如果文件存在则从文件末尾开始,否则创建一个用于读写的新文件。 |
“b” | (仅限 DOS/Windows)二进制文件模式(可能与上面列出的任何关键字母一起出现)。 |
让我们看一下打开,处理和关闭文件的实际示例。在 open_close.rb 中,我首先打开一个文件 ‘myfile.txt’,用于写入(’w’)。打开文件进行写入时,如果该文件尚不存在,则将创建该文件。我使用 puts()
在文件中写入六个字符串,在六行中分别写一个字符串。最后我关闭了文件。
f = File.new("myfile.txt", "w")
f.puts( "I", "wandered", "lonely", "as", "a", "cloud" )
f.close
关闭文件不仅会释放“文件句柄”(file handle,指向文件数据的指针),还会“刷新”(flushes)内存中的数据,以确保它全部保存到磁盘上的文件中。未能关闭文件可能会导致不可预测的副作用(尝试注释掉上面显示的 f.close
以便你自己查看!)。
现在,将文本写入文件后,让我们看看如何打开该文件并重新读取数据。这次我将一次读取一个数据中的字符。在我这样做的时候,我将保留已读过的字符数。我还会保留行数,每当我读入一个换行符时,行数都会递增(给定 ASCII 码 10)。为了清楚起见,我将在每行读取的末尾添加一个字符串,显示其行号。我将在屏幕上显示文件字符加上我的行结束字符串,当从文件中读取所有内容后,我将关闭它并显示我计算的统计数据。这是完整的代码:
charcount = 0
linecount = 0
f = File.new("myfile.txt", "r")
while !( f.eof ) do # while not at end of file...
c = f.getc() # getc gets a single character
if ( c == 10 ) then # ...whose ASCII code is tested
linecount += 1
puts( " <End Of Line #{linecount}>" )
else
putc( c ) # putc here puts the char to screen
charcount += 1
end
end
if f.eof then
puts( "<End Of File>" )
end
f.close
puts("This file contains #{linecount} lines and #{charcount} characters." )