Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語でファイルにランダムアクセスする方法:ftell・rewind・fseek関数の使い方を解説

C言語では、標準ライブラリに用意された次の3つの関数を使うことで、ファイル内の任意の位置へ直接アクセスする「ランダムアクセス」を実現できます。

  • ftell()
  • rewind()
  • fseek()

ftell() 関数

ftell() は、現在のファイルポインタの位置(ファイル先頭からのバイト数)を返す関数です。

構文は以下の通りです。

int n = ftell(ファイルポインタ);

記述例:

FILE *fp;
int n;
-----
-----
n = ftell(fp);

ポイント: ftell() は、ファイルに入力された文字数(バイト数)をカウントする用途でもよく使われます。

rewind() 関数

rewind() は、ファイルポインタをファイルの先頭に移動させる関数です。戻り値はなく、呼び出すだけでポインタ位置がリセットされます。

構文は以下の通りです。

rewind(ファイルポインタ);

記述例:

FILE *fp;
    -----
    -----
    rewind(fp);
    n = ftell(fp);
    printf("%d", n);

実行結果:

0(常に0が出力される)

rewind() の直後に ftell() を呼び出すと、ポインタが必ず先頭(0バイト目)にあるため、常に「0」が表示されます。

fseek() 関数

fseek() は、ファイルポインタをファイル内の特定の位置へ移動させるための関数です。ランダムアクセスの中核となる機能です。

構文は以下の通りです。

fseek(ファイルポインタ, オフセット, 位置);

オフセット(offset)とは

  • 読み書きの際に移動するバイト数を指定します。
  • 正負どちらの値も指定可能です。
    • 正の値 … 前方(ファイル末尾方向)へ移動
    • 負の値 … 後方(ファイル先頭方向)へ移動

位置(position)とは

基準となる位置として、次の3つの値を指定できます。

  • 0 … ファイルの先頭
  • 1 … 現在位置
  • 2 … ファイルの末尾

fseek() の使用例

  • fseek(fp, 0, 2) … fp をファイル末尾から0バイト前方へ移動(=末尾へ移動)

  • fseek(fp, 0, 0) … fp をファイル先頭から0バイト前方へ移動(=先頭へ移動)

  • fseek(fp, m, 0) … fp をファイル先頭からmバイト前方へ移動

  • fseek(fp, -m, 2) … fp をファイル末尾からmバイト後方へ移動

fseek() でエラーになるケース

fseek() 関数に関連する主なエラー例は以下の通りです。

  • fseek(fp, -m, 0) … ファイル先頭より前の位置には移動できないため無効
  • fseek(fp, +m, 2) … ファイル末尾より後ろの位置への移動は無効

このように、ftell() で現在位置を確認しながら、rewind() や fseek() を組み合わせることで、C言語でも柔軟なファイル操作が可能になります。

  1. C言語におけるユニオンとポインタの使い方を徹底解説

    ユニオン(共用体)とは、異なるデータ型を持つ複数の変数が、同一のメモリ領域を共有するための仕組みです。構造体が各メンバーごとに独立したメモリを割り当てるのに対し、ユニオンではすべてのメンバーが同じアドレスを参照するという点が大きな特徴です。 ユニオンの構文 ユニオンを定義するときの基本的な書式は次の通りです。 union タグ名{ データ型 メンバー1; データ型 メンバー2; ---- ---- データ型 メンバーn; }; 実際の記述例を見てみましょう。 union sample{ int a; float b; char

  2. C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説

    ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ