Fileの操作(eof?/read/seek)
#RubySilver
code:.rb
# dataファイルの中身
abcdefg
code: .rb
File.open("data") do |io|
while not io.eof? # ファイルの末尾でないなら処理を実行(中の処理で先頭に戻されるのでずっと実行され続ける)
print io.read(1) # 1文字読み取って出力
io.seek(0, IO::SEEK_SET) # ファイルポインタを先頭に戻す
end
end
#=> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...(無限ループ)
File.open("ファイル名"): ファイルを開く
code:.rb
File.open("data") #=> #<File:data>
eof?: ファイルがEOFに到達しているか
EOFとは: ファイルの終端を示す特殊な記号や状態のこと
while not io.eof?: ファイルがEOFに到達していなければtrue
File#read(integer): ファイルの内容を読み込んで、その文字列を返す。integer文字分読み込む。
IO#read (Ruby 3.4 リファレンスマニュアル)
code: .rb
File.read("data")
=> "abcdefg\n"
File.open("data").read
=> "abcdefg\n"
# 何バイト目まで読み込むか指定できる
File.read("data", 1)
=> "a"
File.open("data").read(1)
=> "a"
今回の例
code: .rb
File.open("data") do |io|
io.read
end
#=> "abcdefg\n"
File.open("data") do |io|
io.read(1) # 1文字目を読み込む
end
#=> "a"
File#seek(offset, whence = IO::SEEK_SET): ファイルポインタを whence の位置から offset だけ移動させる
IO#seek (Ruby 3.4 リファレンスマニュアル)
whence
IO::SEEK_SET: ファイルの先頭から (デフォルト)
IO::SEEK_CUR: 現在のファイルポインタから
IO::SEEK_END: ファイルの末尾から
IO::SEEK_DATA: offset 以降の次にデータがある位置へ(lseek の man ページ参照。Linux 3.1 以降のみ)
IO::SEEK_HOLE: offset 以降の次にホールがある位置へ(同上)
code: .rb
# dataファイルの中身 "abcdefg"
io = File.open("data")
io.seek(0)
io.read
=> "abcdefg\n"
io.seek(1) # 「index1以降を読む」と考える
io.read
=> "bcdefg\n" # "abcdefg" の 2個目から読み込み
# ファイルポインタを先頭から3個移動
io.seek(3, IO::SEEK_SET)
io.read
=> "defg\n" # "abcdefg" の 4個目から読み込み