openメソッドのCR、LF、CRLのまとめ

モードに関して自分が勘違いしていたので備忘録として残します。

#openメソッドとは？
ざっくり言うと、
外部のテキストファイルを開き、モードを使って読み書きができるようにするメソッドです。

例えば、外部のテキストファイルで以下のように書かれた「example.txt」とします。

    ともすけです。

次に、Rubyでファイルをopenメソッドを利用してファイルを開き、書き込む。

    f = File.open("example.txt","a")
    s = f.write("趣味はギターです。")　#example.txtに書き加える
    f.close

上記を実行した結果、

    $ more example.txt
    ともすけです。　#実行前のテキスト
    $ ruby example.rb
    $ more example.txt
    ともすけです。
    趣味はギターです。　　#実行後のテキスト

となります。


#openメソッドの使い方

    .open("テキストまでのパス",(mode=)モード))

|モード|説明|
|:--|:--|
|"r"|ファイルを読み込みモードにして開く(指定が無ければデフォルトはこれになる)|
|"w"|ファイルを書込みモードにして開く|
|"a"|ファイルを書込みモードにして開き、書き込まれたものは末尾に加ます|
|"rt"|CR、LF、CRLFのいずれをもLFとして読み込む|
|"rb"|CR、LF、CRLFはいずれもそのまま読み込む。|
|"wb"|LFはそのままLFとして書き込まれる。|

"r,w,a"に関して"r+,w+,a+"とすると読み書き両用モードで開かれます。

#モード "rt,rb,wb"について
自分が勘違いしていたのは、`rt`を一つのモードかと思っていましたが、
`rt`の`r`は読み出し、`t`は改行文字のCR／LF／CRLFは全てLFとして読み込む
と別々に意味があったと言う事です。
なので、"b"が「改行コードはそのまま読み出す」であることを一緒にすると

|モード|説明|t|b|
|:--|:--|:--|:--|
|r|読み込みモード|CR、LF、CRLFのいずれをもLFとして読み込む|CR、LF、CRLFはいずれもそのまま読み込む。|

と言うようになります。これだと覚えやすいかと思います。

###改行コードとは
コンピューター上での文章に改行する命令を出す文字で
`CR,LF,CRLF`、それじれ改行コードが違う。
`CR`は`\n`、`LF`は`\r\`、`CRLF`は`\r\n`となります。

###それぞれの挙動
三種類のコードテキストに関して`rt,r,(無し)`の挙動を見て
`rt`はCR、LF、CRLFのいずれもがLFとして読み込むのか
`t`がない場合はどのようになるのか
そもそも、何もいれていない場合はどうなるのかを調べる。
以下を参照するテキストとします。

    $ od -c example_lf.txt
    0000000    h   e   l   l   o       w   o   r   l   d   !  \n   h   e   l
    0000020    l   o       w   o   r   l   d   !                            
    0000031
    $ od -c example_cr.txt 
    0000000    h   e   l   l   o       w   o   r   l   d   !  \r   h   e   l
    0000020    l   o       w   o   r   l   d   !                            
    0000031
    $ od -c example_crlf.txt
    0000000    h   e   l   l   o       w   o   r   l   d   !  \r  \n   h   e
    0000020    l   l   o       w   o   r   l   d   !                        
    0000032



####1. `rt`の場合
ソースコード

    puts "-----改行コード LF-----"
    File.open("example_lf.txt") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CR-----"
    File.open("example_cr.txt") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CRLF-----"
    File.open("example_crlf.txt") do |text|
      text.each_line do |line|
        p line
      end
    end

出力結果は

    $ ruby example_1.rb
    -----改行コード LF-----
    "hello world!\n"
    "hello world!"
    -----改行コード CR-----
    "hello world!\n"
    "hello world!"
    -----改行コード CRLF-----
    "hello world!\n"
    "hello world!"


###2. `r`の場合
ソースコード

    puts "-----改行コード LF-----"
    File.open("example_lf.txt","r") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CR-----"
    File.open("example_cr.txt","r") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CRLF-----"
    File.open("example_crlf.txt","r") do |text|
      text.each_line do |line|
        p line
      end
    end

出力結果

    $ ruby example_2.rb
    -----改行コード LF-----
    "hello world!\n"
    "hello world!"
    -----改行コード CR-----
    "hello world!\rhello world!"
    -----改行コード CRLF-----
    "hello world!\r\n"
    "hello world!"

###3. `(無し)`の場合
ソースコード

    puts "-----改行コード LF-----"
    File.open("example_lf.txt") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CR-----"
    File.open("example_cr.txt") do |text|
      text.each_line do |line|
        p line
      end
    end
    puts "-----改行コード CRLF-----"
    File.open("example_crlf.txt") do |text|
      text.each_line do |line|
        p line
      end
    end

出力結果

    $ ruby example_3.rb
    -----改行コード LF-----
    "hello world!\n"
    "hello world!"
    -----改行コード CR-----
    "hello world!\rhello world!"
    -----改行コード CRLF-----
    "hello world!\r\n"
    "hello world!"




#参考文献
https://www.buildinsider.net/language/rubytips/0019
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/open.html