打开和关闭文件

虽然一些标准方法会自动打开和关闭文件,但在处理文件内容时,你需要显式的打开和关闭文件。你可以使用 newopen 方法打开文件。你必须将两个参数传递给其中一个方法 - 文件名和文件 ‘mode’ - 同时将返回一个新的 File 对象。文件模式(modes)可以是由操作系统指定的常量或字符串所定义的整数。该模式通常指示文件是打开以进行读取(’r’),写入(’w’)还是读取和写入(’rw’)。这是可用字符串模式的列表:

Mode Meaning
“r” 只读,从文件开头开始(默认模式)。
“r+” 读写,从文件开头开始。
“w” 只写,将现有文件截断为零长度或创建用于写入的新文件。
“w+” 读写,将现有文件截断为零长度或创建新文件以进行读写。
“a” 只写,如果文件存在则从文件末尾开始,否则创建一个用于写入的新文件。
“a+” 读写,如果文件存在则从文件末尾开始,否则创建一个用于读写的新文件。
“b” (仅限 DOS/Windows)二进制文件模式(可能与上面列出的任何关键字母一起出现)。
open_close.rb

让我们看一下打开,处理和关闭文件的实际示例。在 open_close.rb 中,我首先打开一个文件 ‘myfile.txt’,用于写入(’w’)。打开文件进行写入时,如果该文件尚不存在,则将创建该文件。我使用 puts() 在文件中写入六个字符串,在六行中分别写一个字符串。最后我关闭了文件。

  1. f = File.new("myfile.txt", "w")
  2. f.puts( "I", "wandered", "lonely", "as", "a", "cloud" )
  3. f.close

关闭文件不仅会释放“文件句柄”(file handle,指向文件数据的指针),还会“刷新”(flushes)内存中的数据,以确保它全部保存到磁盘上的文件中。未能关闭文件可能会导致不可预测的副作用(尝试注释掉上面显示的 f.close 以便你自己查看!)。

现在,将文本写入文件后,让我们看看如何打开该文件并重新读取数据。这次我将一次读取一个数据中的字符。在我这样做的时候,我将保留已读过的字符数。我还会保留行数,每当我读入一个换行符时,行数都会递增(给定 ASCII 码 10)。为了清楚起见,我将在每行读取的末尾添加一个字符串,显示其行号。我将在屏幕上显示文件字符加上我的行结束字符串,当从文件中读取所有内容后,我将关闭它并显示我计算的统计数据。这是完整的代码:

  1. charcount = 0
  2. linecount = 0
  3. f = File.new("myfile.txt", "r")
  4. while !( f.eof ) do # while not at end of file...
  5. c = f.getc() # getc gets a single character
  6. if ( c == 10 ) then # ...whose ASCII code is tested
  7. linecount += 1
  8. puts( " <End Of Line #{linecount}>" )
  9. else
  10. putc( c ) # putc here puts the char to screen
  11. charcount += 1
  12. end
  13. end
  14. if f.eof then
  15. puts( "<End Of File>" )
  16. end
  17. f.close
  18. puts("This file contains #{linecount} lines and #{charcount} characters." )