Ruby TIPS
ファイルから1文字ずつ読み込む(入力する)には?
Rubyでテキストファイルから文字列を読み込むための方法として、ファイルから1文字単位で文字を取得する方法と、ファイル内の全テキスト内容を先頭から1文字ずつループ処理する方法を説明する。
前回の「ファイルから文字列を読み込む(入力する)には?(基本編)」では、Rubyでテキストファイルから文字列を読み込むための基本的な方法を解説し、さらにファイル操作をブロックで記述する方法や、読み込み専用モードでファイルを開く方法、文字コードの基本的な取り扱い方を見た。
今回および次回の「ファイルから1行ごと/段落ごと読み込む(入力する)には?」ではその続編として、さまざまな単位でファイルの内容を読み込むメソッドを見ていく。今回は1文字ずつ読み込む方法を見ていこう。
ファイル入出力の基本 − 入力編
ファイルから1文字ずつ読み込む ― getcメソッド、readcharメソッド
1文字ずつの読み込みには、getc
メソッドまたはreadchar
メソッドを使う。この2つのメソッドの働きは、基本的には同じだが、ファイルの末尾に達したときにgetc
メソッドがnilを返し、readchar
メソッドがEOFError
を発生させるという点だけが異なる。
以下の例では、data001.txt
ファイルから、getc
メソッドで3文字読み込んでp
メソッドで表示する。ちなみに、リスト1.5のコードでreadchar
を試したい場合は、単純に「getc」を「readchar」に置換するだけでよい。
File.open("data001.txt", mode="rt"){|f|
p f.getc # 1文字目
p f.getc # 2文字目
p f.getc # 3文字目
}
|
テキストモードでファイルを開いているので、改行文字がLF
、CR
、CRLF
のいずれであってもLF
として取り扱われる。
実行結果は以下の通りである。
$ ruby sample005.rb
"青"
"龍"
"\n"
|
ファイルに含まれる文字列が3文字より少ない場合、getc
メソッドではnilが返されるので、読み込めなかった文字数だけnilが表示される。readchar
メソッドでは、ファイルの末尾以降を読み込もうとした時点でEOFError
エラーとなる。
全ての文字を1文字ずつ読み込む(ブロックを利用) ― each_charメソッド
続いて、全ての文字を1文字ずつ読み込む方法を見てみよう。
この場合、File
クラスのeach_char
メソッドを使うとよい。each_char
メソッドは読み込んだ文字を1文字ずつブロックに渡してくれる。
File.open("data001.txt", mode="rt"){|f|
f.each_char{|c|
p c
}
}
|
単純に1文字ずつ読み込み、その文字を表示する。この例では、読み込まれた文字はブロックパラメーターのc
に渡される。
実行例は以下の通り。
$ ruby sample006.rb
"青"
"龍"
"\n"
"朱"
"雀"
"\n"
"白"
"虎"
"\n"
"玄"
"武"
|
ファイルに含まれる文字が1文字ずつ表示された。文字をそのまま出力するなら、リスト1.6のp
メソッドの代わりにprint
メソッドを使えばよい。
なお、文字単位でなくバイト単位で読み込む場合にはeach_byte
メソッドを使い、コードポイント(1文字のコード)を読み込むにはeach_codepoint
メソッドを使う。
まとめ
getc
メソッドとreadchar
メソッドは1文字読み込むのに使う。each_char
メソッドは、1文字ずつ読み込み、ブロックパラメーターに文字を渡すので、ファイルから1文字ずつ全ての内容を読み込む場合などに使える。
API:IOクラス|Fileクラス|EOFErrorクラス カテゴリ:組み込みライブラリ
API:getcメソッド|readcharメソッド|each_charメソッド カテゴリ:IOクラス
※以下では、本稿の前後を合わせて5回分(第18回~第22回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
19. ファイルから文字列を読み込む(入力する)には?(基本編)
テキストファイルから文字列を読み込むための基礎を解説。ファイル操作をブロックで記述する方法や、ファイルを開く際に「テキスト読み出し専用モード」でアクセスしたり文字コードを指定したりする方法、BOM付きファイルを処理する方法を説明する。
20. 【現在、表示中】≫ ファイルから1文字ずつ読み込む(入力する)には?
Rubyでテキストファイルから文字列を読み込むための方法として、ファイルから1文字単位で文字を取得する方法と、ファイル内の全テキスト内容を先頭から1文字ずつループ処理する方法を説明する。
21. ファイルから1行/段落ごと読み込む(入力する)には?
Rubyでテキストファイルから文字列を読み込むための方法として、ファイル内の全テキスト内容を先頭から1行単位ずつもしくは1段落ずつループ処理する方法と、ファイルから読み込んだ全ての行を配列として返す方法を説明する。
22. ファイルに文字列を書き込む(出力する)には?
テキストファイルに文字列を書き込むための基本を解説。新規書き込みと追加の方法を確認した後、任意の位置から書き込む方法や読み書き両用モードでファイルを利用する方法を説明する。