8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

RubyのFileについてまとめました。

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

実際のファイルの中身を確認してみる

スクリーンショット 2019-12-18 11.43.42.png

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

実際のファイルの中身を確認してみる
スクリーンショット 2019-12-18 11.48.38.png

ではwモードとaモード何が違うのか?

大きな違いは入力の仕方です。
まずはwモード

file = File.open("nyan.txt","w")
=> #<File:nyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close

実際のファイルの中身を確認してみる
↓after
スクリーンショット 2019-12-18 12.01.07.png
↓before
スクリーンショット 2019-12-18 11.43.42.png
先ほどのnyan.textの中身と変わっている。
先ほどの文書が消えていることがわかる。

続いてaモード

file = File.open("nyannyan.txt","a")
=> #<File:nyannyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close

実際のファイルの中身を確認してみる
↓after
スクリーンショット 2019-12-18 12.05.05.png
↓before
スクリーンショット 2019-12-18 11.48.38.png

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

実行結果
スクリーンショット 2019-12-19 15.03.17.png

もう一度w+モードで入力してみる

file = File.open("wan.txt","w+")
=> #<File:wan.txt>
file.read
=> ""
file.puts 'Wanko is big'
file.read 
=> ""
file.close

実行結果
スクリーンショット 2019-12-19 15.30.49.png
となりました。
あれ?って思ったかたいると思いますがwモードとそれほど変わってません。
というのも、w+モードはwモードと同様にファイルを新しくつくりなおすからです。
なので変わったところは読み込みをしてもエラーが出ないということくらいです。

つづいてa+モード

file = File.open("wanwan.txt","a+")
=> #<File:nyan.txt>
file.puts 'Wanko is pretty'
file.read 
=> ""
file.close

実行結果
スクリーンショット 2019-12-20 1.20.21.png

もう一度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

実行結果
スクリーンショット 2019-12-20 1.21.33.png
読み込みもでき、さらに文末に追加されている。

最後に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

実行結果
スクリーンショット 2019-12-20 1.38.37.png
2行目がyになってます。
r+は文の先頭から上書きをします。
なので1行目に書かれていた"Wanko is pretty\n"が"Wanko is fast\n"に上書きされるので

"Wanko is pretty\n" => "Wanko is fast\ny\n"

となりの↓のようになるということが分かりました。
スクリーンショット 2019-12-20 1.38.37.png

以上がFileクラスのモードでした。

最後に

親クラスのIOクラスもまだまだ理解が足りてないので、近いうちにまとめようと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?