Dopo averlo aperto le operazioni base sui file sono la lettura e la scrittura. Per leggere un file una linea alla volta si può utilizzare il metodo gets
ereditato da IO:
while linea = mio_file.gets puts linea end
in questo modo con un ciclo while
non facciamo altro che stampare a video tutte le righe del file. In alternativa è possibile usare anche gli iteratori che insieme a open con i blocchi rendono le operazioni di lettura molto agevoli. Tra gli iteratori troviamo:
- each_byte che chiama il blocco per ogni byte
- each_line, e il suo sinonimo each, chiamano il blocco per ogni riga
Ad esempio supponendo che il nostro file test.txt abbia il seguente contenuto:
Vento invernale Un monaco scinto Cammina nel bosco
possiamo leggerne un carattere alla volta con each_byte
:
File.open("test.txt") do |f| f.each_byte {|c| print c.chr, " "} end
in questo modo trasformiamo il byte letto, un Fixnum
, in carattere con il metodo chr
e poi lo stampiamo seguito da uno spazio. L'output sarà:
V e n t o i n v e r n a l e U n m o n a c o s c i n t o C a m m i n a n e l b o s c o
Gli iteratori each
e each_line
, come detto, permettono invece di iterare su ogni linea del file. Un esempio è:
File.open("test.txt") do |f| f.each {|l| puts "#{f.lineno} #{l}"} end
dove lineno
è un metodo della classe IO che restituisce il numero di linea corrente. L'output sarà dunque:
1 Vento invernale 2 Un monaco scinto 3 Cammina nel bosco
Infine un altro iteratore, che è allo stesso tempo un altro modo per aprire un file, è foreach
che quando è invocato apre il file passatogli come argomento, chiama il blocco per ogni linea e alla fine chiude il file automaticamente:
IO.foreach("test.txt") {|linea| puts linea}
Per scrivere su di un file si utilizza il metodo write
che prende come argomento la stringa da scrivere sul file:
File.open "test.txt", "w" do |mio_file| mio_file.write "Ciao file" end
write
restituisce il numero di byte scritti. In alternativa si può utilizzare anche l'operatore <<
o il metodo puts
. L'esempio precedente diventa:
File.open "test.txt", "w" do |mio_file| mio_file << "Ciao file" end
oppure
File.open "test.txt", "w" do |mio_file| mio_file.puts "Ciao file" end