ホームC言語Tips集ファイル ≫ ファイル位置表示子を指定した位置に位置付ける

C言語Tips集 - ファイル位置表示子を指定した位置に位置付ける

C言語でファイル位置表示子 (file position indicator) を指定した位置に位置付けるには stdio.hfseek 関数を使用します.

fseek

#include <stdio.h>
int fseek (
    FILE  stream,
    long offset,
    int whence
);

fseek 関数はファイル位置表示子の値を変更する関数です.

fseek 関数は stream が指すストリームがバイナリストリームの場合とテキストストリームの場合で使い方が少し異なります.
このあたりは少しややこしいので,ここでは先に引数の説明からさせていただきます.

fseek 関数の引数

fseek 関数の引数は以下の通りです.

  • stream: ストリーム
  • offset: 基準位置から移動するバイト数
  • whence: 基準位置

基準位置 whence には, 以下の3種類のマクロが指定できます.

  • SEEK_SET: ファイルの先頭
  • SEEK_CUR: ファイルの現在位置
  • SEEK_END: ファイルの終端

fseek 関数の動作 - バイナリストリームの場合

バイナリストリームの場合は,基準位置 whence が示す位置に offset を加えた値が新しい位置になります.
ただし,whence に SEEK_END を指定した場合の動作は,処理系によってはサポートされていない場合があります.

fseek 関数の動作 - テキストストリームの場合

バイナリストリームとは異なり,テキストストリームの場合は offset に 0 か,事前に ftell 関数で取得しておいた値しか指定できません.また,offset に ftell 関数の値を指定した場合は whence に SEEK_SET を指定しなければなりません.

テキストストリームに対しての fseek 関数の動作をまとめると以下の 4 種類になります.

  1. offset = 0,whence = SEEK_SET: ファイルの先頭に位置付ける
  2. offset = 0,whence = SEEK_CUR: ファイルの現在位置に位置付ける
  3. offset = 0,whence = SEEK_END: ファイルの終端に位置付ける
  4. offset = ftell 関数の値,whence = SEEK_SET: ftell 関数で取得しておいた値の位置に位置付ける

C言語サンプルプログラム

fseek 関数を使用してファイル位置表示子を指定した位置に位置付けるサンプルプログラムを以下に示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* macros */
#define N 256

/* main */
int main(void) {
    FILE *fp;
    char *filename = "sample.txt";
    char ptr[N] = {'\0'};
    size_t size;
    int i;

    /* ファイルのオープン */
    if ((fp = fopen(filename, "rb")) == NULL) {
        fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
        exit(EXIT_FAILURE);
    }

    /*  7文字分読み込む */
    size = fread(ptr, sizeof(char), 7, fp);

    /* 表示 */
    for ( i = 0; i < size; i++) {
        printf("%c",  ptr[i]);
    }

    /* 現在位置から5バイト進める */
    fseek(fp, 5, SEEK_CUR);

    /* 配列の初期化 */
    memset(ptr, '\0', N);

    /*  10文字分読み込む */
    size = fread(ptr, sizeof(char), 10, fp);

    /* 表示 */
    for ( i = 0; i < size; i++) {
        printf("%c",  ptr[i]);
    }
    printf("\n");

    /* ファイルのクローズ */
    fclose(fp);

    return EXIT_SUCCESS;
}

実行例

サンプルプログラム内で使用する sample.txt の内容は以下のように用意したとします.

I don't want to march as much as possible.

サンプルプログラムの実行結果は以下のようになります.

I don't to march 

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.

ファイルの位置