Ruby技術者認定試験(シルバー)をとるうえで若干おろそかになりがちだけど、しっかり点数を稼いでいきたいFileについてまとめてみました。
基本的に抑えておきたいのはまずこの6つの使い分け
- w :書き込みモード。既存のファイルがあるときはファイルの中身を空にする
- w+ :読み書きモード。既存のファイルの中身は空になる。
- r :読み込みモード。
- r+ :読み書きモード。ファイルの読み込みと書き込みの位置は文の先頭から。
- a :追記モード。既存のファイルの文末に入力内容を追記する。
- a+ :読み書きモード。ファイルの読み込み位置は先頭に、書き込み位置は常に末尾になる
まずはwモード、aモード、rモード から
##ファイル作成
ファイルを作成するのに使うのはwモード、aモードの書き込みモードのみ
またFile.open、File.newどちらも利用できる
file = File.open("nyan_by_w.txt","w")
=> #<File:nyan_by_w.txt>
#ファイルが実在するか確認
File.exist?("nyan_by_w.txt")
=> true
file = File.open("nyan_by_a.txt","a")
=> #<File:nyan_by_a.txt>
File.exist?("nyan_by_a.txt")
=> true
file = File.new("nyan_by_w.txt","w")
=> #<File:nyan_by_w.txt>
File.exist?("nyan_by_w.txt")
=> true
file = File.new("nyan_by_a.txt","a")
=> #<File:nyan_by_a.txt>
File.exist?("nyan_by_a.txt")
=> true
##ファイルの記述
wモードとaモード
wモードは記述ができる。
またwモードで同じファイルに書き込もうとすると、前の内容はリセットされて、記述される。
file = File.new("nyan.txt","w")
=> #<File:nyan.txt>
#putsメソッドで記入ができる
file.puts('Hello,Nyanko')
file.puts 'Nyanko is pretty'
#writeメソッドでも記述可能
file.write('Nyanko is MofuMofu')
file.write 'Nyanko is little'
file.close
実際のファイルの中身を確認してみる
putsメソッドを使うと改行され、writeメソッドを使うと改行されないことがわかりました。
またaモードでも同じように記述できます。
file = File.new("nyannyan.txt","a")
=> #<File:nyannyan.txt>
#putsメソッドで記入ができる
file.puts('Hello,Nyanko')
file.puts 'Nyanko is pretty'
#writeメソッドでも記述可能
file.write('Nyanko is MofuMofu')
file.write 'Nyanko is little'
file.close
ではwモードとaモード何が違うのか?
大きな違いは入力の仕方です。
まずはwモード
file = File.open("nyan.txt","w")
=> #<File:nyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close
実際のファイルの中身を確認してみる
↓after
↓before
先ほどのnyan.textの中身と変わっている。
先ほどの文書が消えていることがわかる。
続いてaモード
file = File.open("nyannyan.txt","a")
=> #<File:nyannyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close
実際のファイルの中身を確認してみる
↓after
↓before
wモードはファイルの中身を空にして入力するのに対して、aモードは文末から追記するという違いがわかりました。
#ちなみにwモードとaモードでreadメソッドを使うと下記のエラーがでる。
IOError: not opened for reading
##ファイルの読み込み
次はファイルの読み込みです。
rモードで読み込んださいは、読み込みしかできません。
まずは普通にnyannyan.txtを読み込んでみます。
file = File.open("nyannyan.txt","r")
file.read
=> "Hello,Nyanko\nNyanko is prety\nNyanko is MofuMofuNyanko is litleWanko is a friend\n"
#あえて書き込んでみる。
file.puts "HiNyanko"
IOError: not opened for writing #エラーがでる
file.close
rモードは読み込みできるが、書き込みはできないということが分かりました。
ここまででwモード、aモード、rモードの挙動がわかりました。
w+、a+、r+
つづいてw+モード、a+モード、r+モードについて
基本的には+がつくことで読み書きができるようになっている。
一つ一つ挙動を確かめてみる。
まずはw+モード
file = File.new("wan.txt","w+")
=> #<File:wan.txt>
file.puts 'Wanko is pretty'
file.read #書き込みが終わっていないので文字は出ないがエラーにはならない。
=> ""
file.close
もう一度w+モードで入力してみる
file = File.open("wan.txt","w+")
=> #<File:wan.txt>
file.read
=> ""
file.puts 'Wanko is big'
file.read
=> ""
file.close
実行結果
となりました。
あれ?って思ったかたいると思いますがwモードとそれほど変わってません。
というのも、w+モードはwモードと同様にファイルを新しくつくりなおすからです。
なので変わったところは読み込みをしてもエラーが出ないということくらいです。
つづいてa+モード
file = File.open("wanwan.txt","a+")
=> #<File:nyan.txt>
file.puts 'Wanko is pretty'
file.read
=> ""
file.close
もう一度wanwan.txtファイルに入力してみる。
file = File.open("wanwan.txt","a+")
=> #<File:wanwan.txt>
file.read
=> "Wanko is pretty\n"
file.puts 'Wanko is big'
file.read
=> ""
file.close
最後にr+モード
file = File.open("wanwanko.txt","r+")
Errno::ENOENT: No such file or directory @ rb_sysopen - wanwanko.txt
新しいファイルをr+モードで作ろうとするとエラーがでる。
ということで、r+モードでファイルの新規作成はできない。
なので、先ほど使ったwanwan.txtを使ってみる
file = File.open("wanwan.txt","r+")
=> #<File:wanwan.txt>
file.puts 'Wanko is fast'
file.read
=> "y\nWanko is big\n"
file.close
実行結果
2行目がyになってます。
r+は文の先頭から上書きをします。
なので1行目に書かれていた"Wanko is pretty\n"が"Wanko is fast\n"に上書きされるので
"Wanko is pretty\n" => "Wanko is fast\ny\n"
以上がFileクラスのモードでした。
##最後に
親クラスのIOクラスもまだまだ理解が足りてないので、近いうちにまとめようと思います。