モードに関して自分が勘違いしていたので備忘録として残します。
#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