1、文件的打开/关闭
通过IO类的子类File类可以进行文件的输入、输出处理。File类中封装了文件的删除、文件属性变更等文件专用的功能,而一些基本的输入输出处理则使用继承自IO类的方法.
io = File.open(file, mode)
io = open(file, mode)
通过File.open方法或open方法打开文件并获取新的IO对象。模式(mode)会指定以何种目的打开文件,缺省模式为制度模式(“r”)。
(a)io.close 使用close方法关闭已打开的文件。1个程序中同时打开文件的数量是有限的,因此使用完的文件要尽快关闭。如果打开多个文件而不进行关闭操作,程序就很可能会在使用open方法时突然产生异常。File.open 方法如果使用块,则文件会在使用完后自动关闭。这种情况下,IO对象会被作为块变量传递给块。快执行完毕后,块变量引用IO对象也会自动关闭。这种写法回事输入/输出范围更加清晰。
File.open("test.txt") do |io|
while line =io.gets
......
end
end
(b)io.closed? 用close?方法可以检查IO对象是否关闭了。 io = File.open("test.txt")
io.close
p io.closed? #>true
(c)File.read(file) 使用类方法read可以一次性读取文件file的内容 data = File.read("test.txt")
2、文件输入操作
(a)、io.gets(rs)/io.each(rs)/io.each_line(rs)/io.readlines(rs) 从IO类的对象io中读取一行数据。用参数rs的字符串分行。缺省rs时则用预定义变量$/(默认值为"\n")。
这些方法返回的字符串中包含行末尾的换行符。用chmop!方法可以方便地删除字符串末尾的换行符。输入完毕后再尝试获取数据时,gets方法会返回nil。另外,我们可使用eof?方法检查输入是否完毕。
while line = io.gets
line.chomp!
...... #对line进行操作
end
p io.eof? #=>true
用each_line、readlines也可以实现同样的效果 io.each_line do |line|
line.chomp!
...... #对line进行的操作
end
另外,用readlines方法返回存放每行数据的数组
ary = io.readlines
ary.each_line do |line|
line.chomp!
...... #对line进行操作
end
(b)、io.lineno/io.lineno=(number) 使用gets方法、each_line方法逐行读取数据时,会自动记录读取的行数。这个行数可以通过lineno方法取得。此外,通过lineno=方法也可以改变这个值,但值的改变并不会对文件的指针有影响。
$stdin.each_line do |line|
printf("%3d %s", $stdin.lineno, line)
end
(c)、io.each_char 逐个字符地读取io中的数据并执行块。将得到的字符(String对象)作为块变量传递。
io.each_char do |ch|
... #对line进行的操作
end
(d)、io.each_byte 逐个字节地读取io中的数据并启动块。将得到的字节所对应的ASCII码以整数形式传递给块变量。
(e)、io.getc 只读取io中的一个字符。根据文件的编码不同,有时一个字符会由多个字节组成,但这个方法只会读取一个字符,然后返回其字符串对象。数据读完继续读返回nil。
while ch = io.getc
...... #对line进行操作
end
(f)、io.ungetc(ch) 将参数ch指定的字符退回到io的输入缓冲中。(g)、io.getbyte 只读取io中的一个字节,返回得到的字节转换为ASCII码后的整数对象。数据全部读取玩后再读取时会返回nil。
(h)、io.ungetbyte(byte) 将参数byte指定的一个字节退回到输入缓冲中。参数为整数时,将该整数除以256后的余数作为ASCII码字符返回一个字节;参数为字符串时,返回字符串的第一个字节。
(i)、io.read(size) 读取参数size指定的大小的数据。不指定大小时,则一次性读取全部数据并返回。
3、输出操作
(a)、io.puts(str0,str1,...) 对字符串末尾添加换行符后输出。指定多个参数时,会分别添加换行符。
(b)、io.putc(ch) 输出参数ch指定的字符编码所对应的字符。参数为字符串时输出首字符。
(c)、io.print(str0,str1,...) 输出参数指定字符串。参数可指定多个字符串。参数为String 以外的对象时会自动将其转换为字符串。
(d)、io.printf(fmt,arg0,arg1,...) 按照指定格式输出字符串。
(e)、io.write(str) 输出参数str指定的字符串。参数为String以外的对象时会自动将其转换为字符串。方法返回值为输出的字节数。
(f)、io<< str 输出参数str指定的字符串。<< 会返回接受者本身