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

C言語のfseek()とrewind()関数とは?使い方とサンプルコードを徹底解説

C言語では、ファイル内の任意の位置にアクセスするために「ファイルポインタ」を操作する仕組みが用意されています。本記事では、その中でも特に重要なfseek()rewind()という2つの標準ライブラリ関数について、構文・パラメータ・実際のコード例を交えながら詳しく解説します。


fseek()関数とは

fseek()は、C言語においてファイルポインタを指定した位置へ移動させるための関数です。移動先は「オフセット(基準位置からのバイト数)」と「ストリーム(対象ファイル)」として引数で指定します。処理が成功した場合は0を返し、失敗した場合は0以外(非ゼロ)の値を返します。

fseek()の構文

int fseek(FILE *stream, long int offset, int whence)

fseek()の主なパラメータ

  • stream ─ 対象となるストリーム(ファイル)を識別するためのポインタです。

  • offset ─ 基準位置(whence)から何バイト移動するかを指定する値です。

  • whence ─ オフセットを加算する基準となる位置を指定します。

whenceには、以下のいずれかの定数を指定します。

  • SEEK_END ─ ファイルの終端を基準とします。

  • SEEK_SET ─ ファイルの先頭を基準とします。

  • SEEK_CUR ─ 現在のファイルポインタの位置を基準とします。

fseek()の使用例

ここでは、次のような内容を持つ「demo.txt」というファイルを例に考えます。

This is demo text!
This is demo text!
This is demo text!
This is demo text!

このファイルのサイズを求めるプログラムを見てみましょう。

サンプルコード

#include<stdio.h>
void main() {
    FILE *f;
    f = fopen("demo.txt", "r");
    if(f == NULL) {
        printf("\n Can't open file or file doesn't exist.");
        exit(0);
    }
    fseek(f, 0, SEEK_END);
    printf("The size of file : %ld bytes", ftell(f));
    getch();
}

実行結果

The size of file : 78 bytes

コードの解説

このプログラムでは、まずfopen()を使って「demo.txt」を読み込みモードで開きます。続いてfseek(f, 0, SEEK_END)を呼び出すことで、ファイルポインタをファイルの終端まで移動させています。終端に移動した状態でftell()を呼び出すと、現在のポインタ位置=ファイルサイズ(バイト数)が取得できるという仕組みです。

f = fopen("demo.txt", "r");
if(f == NULL) {
    printf("\n Can't open file or file doesn't exist.");
    exit(0);
}
fseek(f, 0, SEEK_END);

なお、fopen()の戻り値がNULLかどうかを必ずチェックしています。これは、ファイルが存在しない場合や開けない場合に備えたエラー処理であり、安全なファイル操作のための基本です。


rewind()関数とは

rewind()は、ファイルポインタを指定されたストリームの先頭に戻すための関数です。名前の通り「巻き戻す」動作を行います。なお、rewind()は戻り値を持ちません。

rewind()の構文

void rewind(FILE *stream);

rewind()の使用例

今度は、次のような内容を持つ「new.txt」というファイルを例にします。

This is demo!
This is demo!

このファイルに対してrewind()を使った例を見てみましょう。

サンプルコード

#include<stdio.h>
void main() {
    FILE *f;
    f = fopen("new.txt", "r");
    if(f == NULL) {
        printf("\n Can't open file or file doesn't exist.");
        exit(0);
    }
    rewind(f);
    fseek(f, 0, SEEK_END);
    printf("The size of file : %ld bytes", ftell(f));
    getch();
}

実行結果

The size of file : 28 bytes

コードの解説

このプログラムでは、fopen()でファイルを開いた後、ポインタ変数がNULLの場合には「ファイルを開けない、または存在しない」というメッセージを表示して終了します。その後、rewind(f)によってファイルポインタをファイルの先頭に移動させ、さらにfseek(f, 0, SEEK_END)で終端へ移動してからftell()でファイルサイズを表示しています。

f = fopen("new.txt", "r");
if(f == NULL) {
    printf("\n Can't open file or file doesn't exist.");
    exit(0);
}
rewind(f);

まとめ:fseek()とrewind()の違い

両者の役割を整理すると以下のようになります。

  • fseek() ─ ファイルポインタを任意の位置(先頭・現在位置・終端を基準)へ柔軟に移動できる。成功時は0を返す。

  • rewind() ─ ファイルポインタを常に先頭へ戻す専用の関数。戻り値はない。

ファイルサイズの取得や、ファイルの読み書き位置の再設定など、ランダムアクセスが必要な場面ではfseek()とrewind()を使い分けることで、効率的かつ可読性の高いコードを書くことができます。ぜひ実際のプログラムで試してみてください。

  1. 7Zファイルとは?開き方・作り方・変換方法をわかりやすく解説

    拡張子が .7Z のファイルは、「7-Zip Compressed(7-Zip圧縮ファイル)」と呼ばれる圧縮アーカイブです。パソコン上のフォルダに少し似ていますが、実際にはひとつのファイルとして機能します。 フォルダと7Zファイルは、どちらも複数のファイルやサブフォルダを格納できる点で共通しています。しかしフォルダと違って、7Zファイルは .7Z という拡張子を持つ単一のファイルであり、中身のデータを圧縮してまとめたアーカイブである点が大きな違いです。 7Zファイルを目にするのは、主にインターネットからファイルをダウンロードするときです。ソフトウェア一式、写真アルバム、大量のドキュメントなど

  2. AIファイルとは?開き方から変換方法まで徹底解説

    この記事のポイントAIファイルは、Adobe Illustrator(アドビ イラストレーター)で作成されるベクター画像ファイルです。開くにはIllustratorを使用するか、無料のInkscapeなどを利用できます。Zamzarなどのオンラインツールや各種ソフトを使って、PNG・JPG・SVGなどの形式に変換できます。この記事では、AIファイルの概要から、実際に開く方法、SVG・JPG・PDF・PNGなど他の形式への変換方法まで、わかりやすく解説します。他のソフトウェアとの互換性を持たせたい場合にも役立つ内容です。AIファイルとは何か拡張子が「.ai」のファイルは、ほとんどの場合、Adob