0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】IOクラスのファイルポインタを理解する

Posted at

はじめに

こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は、RubyのIOクラスを学ぶ中で登場するファイルポインタの概念について解説します。
普段の変数操作では意識することがなかったファイルポインタが、なぜファイル操作で必要になるのかを理解し、実際の操作方法も紹介したいと思います。

ファイルポインタとは?

メモリ上のデータ vs ファイルのデータ

Rubyでは、文字列や数値などの変数を操作する際、メモリ上で全てを自由に扱えます。
しかし、ファイルはディスク上のリソースとして扱われるため、効率的なアクセスが求められます。
ここで登場するのがファイルポインタです。

まずはよく見るようなメモリ上のデータ、つまり変数操作をする例です。

a = "Hello world"
puts a  # => Hello world
puts a  # => Hello world

この場合、データは常に変数 a に格納されており、何度でも出力できます。
変数はすでにメモリ上に展開されているため、アクセス時に位置管理を行う必要がないのです。

続いて、変数ではなくファイルのデータを操作する例を見てみましょう。

File.open("example.txt", "r") do |file|
  puts file.read  # ファイル全体を読み込む
  puts file.read  # すでにファイルの終端にいるため、何も出力されない
end

最初の file.read でファイル全体を読み込むと、2回目の file.read では何も出力されません。
ファイルは外部リソースであるため、現在の読み込み位置をファイルポインタで管理する必要があります。
これにより、次のデータがどこから読み込まれるかが決定されるのです。

ファイルポインタが存在する理由

ファイルポインタは、効率的なデータアクセスを可能にするためのものです。
ファイルは「ストリーム」として扱われます。
ストリームとは、データを順次処理するための仕組みです。
ファイルは一度にすべてをメモリに読み込むのではなく、ポインタによって管理された位置から必要なデータを少しずつ取り出します。
これにより、大きなファイルでもメモリ効率よく操作できます。

ファイルポインタを操作するメソッド

 ポインタの説明  説明
pos 現在のファイルポインタの位置を取得・設定する
seek ファイルポインタを任意の位置に移動する
rewind ファイルポインタをファイルの先頭に戻す

pos メソッド

pos は現在のファイルポインタの位置を取得したり、任意の位置に設定するために使います。

File.open("example.txt", "r") do |file|
  puts "現在の位置: #{file.pos}"  # => 0(ファイルの先頭)
  file.read(5)
  puts "読み込み後の位置: #{file.pos}"  # => 5(5バイト読み込んだ後)
end

seek メソッド

seek を使うと、ファイルポインタを任意の位置に移動できます。

File.open("example.txt", "r") do |file|
  file.seek(10)    # ファイルの10バイト目に移動
  puts file.read   # そこからデータを読み込む
end

また、オプションを使って、先頭からの相対位置だけでなく、現在位置やファイルの末尾からの移動も指定できます。

 オプション  説明
IO::SEEK_SET ファイルの先頭からのオフセット
IO::SEEK_CUR 現在の位置からのオフセット
IO::SEEK_END ファイルの末尾からのオフセット
file.seek(10)                 # 先頭から10バイト進む(デフォルト)
file.seek(5, IO::SEEK_CUR)    # 現在位置から5バイト進む
file.seek(-10, IO::SEEK_END)  # ファイル末尾から10バイト戻る

rewind メソッド

rewind を使うと、ファイルポインタをファイルの先頭に戻すことができます。

File.open("example.txt", "r") do |file|
  file.read(10)
  puts "現在の位置: #{file.pos}"  # => 10
  file.rewind
  puts "リセット後の位置: #{file.pos}"  # => 0
end

ファイルポインタの活用例

以下のコードでは、seekrewind を組み合わせてファイル内の特定位置を操作する方法を示します。

# example.txt には "Hello world" と記載されています
File.open("example.txt", "r") do |file|
  file.seek(6)      # "world" の "w" に移動
  puts file.read(5) # => world
  file.rewind       # ファイルの先頭に戻る
  puts file.read(5) # => Hello
end

出力結果は以下の通りです

world
Hello

まとめ

ファイル操作では、データの読み書き位置を管理するためにファイルポインタが重要な役割を果たします。
RubyのIOクラスには、ファイルポインタを操作するための便利なメソッドが多数用意されています。

  • pos: 現在の位置を確認・設定
  • seek: 任意の位置に移動
  • rewind: ファイルの先頭に戻す
    ファイルポインタを適切に活用することで、柔軟で効率的なファイル操作が可能になります。
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?