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

Ruby技術者認定試験(シルバー)をとるうえで若干おろそかになりがちだけど、しっかり点数を稼いでいきたいFileについてまとめてみました。

基本的に抑えておきたいのはまずこの6つの使い分け

- w  :書き込みモード。既存のファイルがあるときはファイルの中身を空にする
- w+ :読み書きモード。既存のファイルの中身は空になる。
- r  :読み込みモード。
- r+ :読み書きモード。ファイルの読み込みと書き込みの位置は文の先頭から。
- a :追記モード。既存のファイルの文末に入力内容を追記する。
- a+ :読み書きモード。ファイルの読み込み位置は先頭に、書き込み位置は常に末尾になる

まずはwモード、aモード、rモード から
##ファイル作成
ファイルを作成するのに使うのはwモード、aモードの書き込みモードのみ
またFile.open、File.newどちらも利用できる

```ruby
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モードで同じファイルに書き込もうとすると、前の内容はリセットされて、記述される。

```ruby
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
```
実際のファイルの中身を確認してみる

<img width="386" alt="スクリーンショット 2019-12-18 11.43.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/9f1712ba-f8c9-9fe4-b4d9-b5491fbf30e3.png">

putsメソッドを使うと改行され、writeメソッドを使うと改行されないことがわかりました。

またaモードでも同じように記述できます。

```ruby
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
```
実際のファイルの中身を確認してみる
<img width="380" alt="スクリーンショット 2019-12-18 11.48.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/a3492683-466e-798d-44af-fa839702fd14.png">

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

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

```ruby
file = File.open("nyan.txt","w")
=> #<File:nyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close
```
実際のファイルの中身を確認してみる
↓after
<img width="374" alt="スクリーンショット 2019-12-18 12.01.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/03e578f1-d795-6516-d905-f86344c30bc1.png">
↓before
<img width="386" alt="スクリーンショット 2019-12-18 11.43.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/9f1712ba-f8c9-9fe4-b4d9-b5491fbf30e3.png">
先ほどのnyan.textの中身と変わっている。
先ほどの文書が消えていることがわかる。

続いてaモード

```ruby
file = File.open("nyannyan.txt","a")
=> #<File:nyannyan.txt>
#追記してみる
file.puts 'Wanko is a friend'
file.close
```
実際のファイルの中身を確認してみる
↓after
<img width="409" alt="スクリーンショット 2019-12-18 12.05.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/19d1168f-a132-6f5e-c542-8c33ea5c2691.png">
↓before
<img width="380" alt="スクリーンショット 2019-12-18 11.48.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/a3492683-466e-798d-44af-fa839702fd14.png">

wモードはファイルの中身を空にして入力するのに対して、aモードは文末から追記するという違いがわかりました。

```ruby
#ちなみにwモードとaモードでreadメソッドを使うと下記のエラーがでる。
IOError: not opened for reading
```


##ファイルの読み込み
次はファイルの読み込みです。
rモードで読み込んださいは、読み込みしかできません。
まずは普通にnyannyan.txtを読み込んでみます。

 ```ruby
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+モード

```ruby
file = File.new("wan.txt","w+")
=> #<File:wan.txt>
file.puts 'Wanko is pretty'
file.read #書き込みが終わっていないので文字は出ないがエラーにはならない。
=> ""
file.close
```
実行結果
<img width="357" alt="スクリーンショット 2019-12-19 15.03.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/a4e1c751-4d05-fab4-c5f3-d0da78b128b8.png">

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

```ruby
file = File.open("wan.txt","w+")
=> #<File:wan.txt>
file.read
=> ""
file.puts 'Wanko is big'
file.read 
=> ""
file.close
```
実行結果
<img width="371" alt="スクリーンショット 2019-12-19 15.30.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/28acab9a-cb47-55b5-1438-3b4802b2a294.png">
となりました。
あれ？って思ったかたいると思いますがwモードとそれほど変わってません。
というのも、w+モードはwモードと同様にファイルを新しくつくりなおすからです。
なので変わったところは読み込みをしてもエラーが出ないということくらいです。

つづいてa+モード

```ruby
file = File.open("wanwan.txt","a+")
=> #<File:nyan.txt>
file.puts 'Wanko is pretty'
file.read 
=> ""
file.close
```
実行結果
<img width="370" alt="スクリーンショット 2019-12-20 1.20.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/984d65a2-9de5-60c6-b859-7d444c483725.png">

もう一度wanwan.txtファイルに入力してみる。

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

```
実行結果
<img width="386" alt="スクリーンショット 2019-12-20 1.21.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/7a8ac7b6-c1db-1b1d-6fcb-60c9cf5cffa8.png">
読み込みもでき、さらに文末に追加されている。

最後にr+モード

```ruby
file = File.open("wanwanko.txt","r+")
Errno::ENOENT: No such file or directory @ rb_sysopen - wanwanko.txt
```
新しいファイルをr+モードで作ろうとするとエラーがでる。
ということで、r+モードでファイルの新規作成はできない。
なので、先ほど使ったwanwan.txtを使ってみる

```ruby
file = File.open("wanwan.txt","r+")
=> #<File:wanwan.txt>
file.puts 'Wanko is fast'
file.read
=> "y\nWanko is big\n"
file.close
```
実行結果
<img width="376" alt="スクリーンショット 2019-12-20 1.38.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/1298628d-aea6-9326-303f-0deecaf8a6b7.png">
2行目がyになってます。
r+は文の先頭から上書きをします。
なので1行目に書かれていた"Wanko is pretty\n"が"Wanko is fast\n"に上書きされるので

```ruby
"Wanko is pretty\n" => "Wanko is fast\ny\n"
```
となりの↓のようになるということが分かりました。
<img width="376" alt="スクリーンショット 2019-12-20 1.38.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547448/1298628d-aea6-9326-303f-0deecaf8a6b7.png">

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

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