# Leggere e scrivere file in Ruby

**URL:** <https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408>\
**Category:** IT\
**Created:** [August 25, 2006, 11:44am UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408 "2006-08-25T11:44:28Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 25, 2006, 11:44am UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/1 "2006-08-25T11:44:28Z")

</div>

Ciao a tutti!  
Sto’ cominciando a smanettare con Ruby e volevo leggere e scrivere file.  
In Eclipse con il plugin RDT ho scritto:

$stdout.sync = true

def stampa\_file nome\_file

```
open nome_file.each do |riga|
    riga.chomp!
    puts riga
end

```

end

puts “”

puts “Inserisci il nome del file da stampare a video:”  
nome\_file = gets.chomp!

stampa\_file nome\_file

Il risultato dell’elaborazione Ã¨ il seguente messaggio d’errore:  
in `each\_line’: no block given (LocalJumpError)

Cosa non mi Ã¨ chiaro? ☹

Grazie a tutti.  
Ciao ciao!

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 25, 2006, 12:08pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/2 "2006-08-25T12:08:43Z")

</div>

Il Sistema wrote:

> Ciao a tutti!  
> Sto’ cominciando a smanettare con Ruby e volevo leggere e scrivere file.  
> In Eclipse con il plugin RDT ho scritto:
> 
> $stdout.sync = true
> 
> def stampa\_file nome\_file
> 
> ```
> open nome_file.each do |riga|
> riga.chomp!
> puts riga
> end
> 
> ```
> 
> end
> 
> puts “”
> 
> puts “Inserisci il nome del file da stampare a video:”  
> nome\_file = gets.chomp!
> 
> stampa\_file nome\_file
> 
> Il risultato dell’elaborazione Ã¨ il seguente messaggio d’errore:  
> in `each’: no block given (LocalJumpError)
> 
> Cosa non mi Ã¨ chiaro? ☹
> 
> Grazie a tutti.  
> Ciao ciao!

Dopo averci perso una giornata (per questo avevo mollato e chiesto  
aiuto… 🙂 il mistero ha trovato soluzione. La open del file va fatta  
cosÃ¬:

```
open(nome_file).each do |riga|

```

Scusate se ho preso spazio nel forum…  
ciao ciao.

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 27, 2006, 2:26pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/3 "2006-08-27T14:26:30Z")

</div>

Il 25-08-2006 Il Sistema ha scritto:

> ```
> open(nome_file).each do |riga|
> 
> ```

Non necessariamente. Io preferisco

File.open(file\_name) do |f|  
f.each\_line do |l|  
puts l.chomp  
end  
end

cosÃ¬ non ti scordi di chiudere il file, fra l’altro

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 28, 2006, 2:50pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/4 "2006-08-28T14:50:41Z")

</div>

Potrei dire una castronata, ma File.open \*Ã¨ \*necessario a meno che non  
fai un “include File”.  
O sbaglio?

In ogni caso Ã¨ buona prassi assicurarsi che usi proprio il metodo open  
di File e non di qualche altro modulo, quindi sarei comunque propenso  
per un “File.open(filename) do …”

🙂

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 28, 2006, 2:42pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/5 "2006-08-28T14:42:26Z")

</div>

Enrico F. wrote:

> Il 25-08-2006 Il Sistema ha scritto:
> 
> > ```
> > open(nome_file).each do |riga|
> > 
> > ```
> 
> Non necessariamente. Io preferisco
> 
> File.open(file\_name) do |f|  
> f.each\_line do |l|  
> puts l.chomp  
> end  
> end
> 
> cosÃ¬ non ti scordi di chiudere il file, fra l’altro

Ah, caspita… ero convinto di ottenere la chiusura del file “a gratis”  
da parte della open giÃ con quel codice, ma avevo interpretato male la  
documentazione: la open va passata subito al blocco che la elabora e non  
dopo avergli applicato un metodo (each o each\_line che sia) come avevo  
fatto io.  
Grazie per il prezioso suggerimento, mi ha risolto un po’ di rogne per  
cui stavo per scrivere. 😉

Ciao ciao!

P.S. File non e’ obbligatorio, pertanto il tutto diventa:

open(file\_name) do |f|  
f.each\_line do |l|  
puts l.chomp  
end  
end

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 28, 2006, 3:47pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/6 "2006-08-28T15:47:00Z")

</div>

david wrote:

> Potrei dire una castronata, ma File.open \*Ã¨ \*necessario a meno che non  
> fai un “include File”.  
> O sbaglio?
> 
> In ogni caso Ã¨ buona prassi assicurarsi che usi proprio il metodo open  
> di File e non di qualche altro modulo, quindi sarei comunque propenso  
> per un “File.open(filename) do …”
> 
> 🙂

- no, non serve e per curiosita’ ho scritto:

Risultato: salta fuori File, insomma, una open di “sistema”! 😉

- si, condivido!

Grazie, ciao ciao. 🙂

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 29, 2006, 1:20pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/7 "2006-08-29T13:20:59Z")

</div>

> IMO è giusto usare File.open se si vuole essere sicuri  
> di accedere solo a file locali, altrimenti open è più  
> corto e permette più elasticità.

Ok, hai convinto almeno me. Ha senso quel che dici. “File.open” _è_ più  
leggibile, ma certamente meno flessibile e meno “Ruby”.

🙂

–  
“Remember, always be yourself. Unless you suck.” - Joss Whedon

---

<div class="post-metadata">

**Author:** ![ilsistema](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/e8c25b/32.png) [@ilsistema](https://www.ruby-forum.com/u/ilsistema)\
**Post date:** [August 28, 2006, 10:44pm UTC](https://www.ruby-forum.com/t/leggere-e-scrivere-file-in-ruby/66408/8 "2006-08-28T22:44:29Z")

</div>

— Il Sistema [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> david wrote:
> 
> > Potrei dire una castronata, ma File.open \*è  
> > \*necessario a meno che non  
> > fai un “include File”.  
> > O sbaglio?
> 
> - no, non serve e per curiosita’ ho scritto:
> 
> Risultato: salta fuori File, insomma, una open di  
> “sistema”! 😉

la open non qualificata richiama (in genere)  
Kernel#open, che è un wrapper sopra File.open, ed è un  
buon posto dove sbattere funzionalità aggiuntive non  
specifiche del file system.

Insomma, sto cercando di dire che facendo “require  
‘open-uri’” si possono aprire risorse ftp o http anche  
se non sono File locali 🙂

Tra l’altro in ruby 1.9 Kernel#open usa un piccolo ed  
utile protocollo, ovvero prova a richiamare un metodo  
#to\_open se esiste per cui è possibile aggiungere  
facilmente classi “open-abili” (esempio: Pathname).

IMO è giusto usare File.open se si vuole essere sicuri  
di accedere solo a file locali, altrimenti open è più  
corto e permette più elasticità.

–  
icq: #69488917  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

* * *

Do You Yahoo!?  
Poco spazio e tanto spam? Yahoo! Mail ti protegge dallo spam e ti da  
tanto spazio gratuito per i tuoi file e i messaggi  
[http://mail.yahoo.it](http://mail.yahoo.it)
