Você pode ler o arquivo de uma só vez:
content = File.readlines 'file.txt'
content.each_with_index{|line, i| puts "#{i+1}: #{line}"}
Quando o arquivo é grande, ou pode ser grande, geralmente é melhor processá-lo linha por linha:
File.foreach( 'file.txt' ) do |line|
puts line
end
Às vezes, você deseja acessar o identificador de arquivo ou controlar as leituras:
File.open( 'file.txt' ) do |f|
loop do
break if not line = f.gets
puts "#{f.lineno}: #{line}"
end
end
No caso de arquivos binários, você pode especificar um separador nulo e um tamanho de bloco, assim:
File.open('file.bin', 'rb') do |f|
loop do
break if not buf = f.gets(nil, 80)
puts buf.unpack('H*')
end
end
Finalmente, você pode fazer isso sem um bloco, por exemplo, ao processar vários arquivos simultaneamente. Nesse caso, o arquivo deve ser explicitamente fechado (aprimorado conforme o comentário de @antinome):
begin
f = File.open 'file.txt'
while line = f.gets
puts line
end
ensure
f.close
end
Referências: API do arquivo e a API do IO .