1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-05

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

#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を一つのモードかと思っていましたが、
rtrは読み出し、tは改行文字のCR/LF/CRLFは全てLFとして読み込む
と別々に意味があったと言う事です。
なので、"b"が「改行コードはそのまま読み出す」であることを一緒にすると

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

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

###改行コードとは
コンピューター上での文章に改行する命令を出す文字で
CR,LF,CRLF、それじれ改行コードが違う。
CR\nLF\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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?