fseek関数 - ファイルストリームの位置指定子を位置を設定

fseek関数を使うと、ファイルストリームの位置指定子が指す位置を設定できます。stdio.hヘッダを読み込むと使えます。

#include <stdio.h>
int fseek(FILE *fp, long offset, int origin);

第一引数は、ファイルストリームです。第二引数は、ファイルストリームの位置指定子が指す相対位置です。第三引数を基準位置とします。第三引数は、基準とする位置です。「SEEK_SET」でファイルの先頭、「SEEK_CUR」でファイルの現在位置、「SEEK_END」で、ファイルの末尾を指定できます。

fseek関数が使用される主な用途は、データが固定長のファイルの読み書きをするときと、ファイルサイズを取得したいときです。

ファイルサイズを取得するサンプル

fseek関数とftell関数を使って、ファイルサイズを取得するサンプルです。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main(void) {
  // ファイルを開く
  const char* in_file = "input.txt";
  FILE* in_fp = fopen(in_file, "r");
  if (in_fp == NULL) {
    fprintf(stderr, "Can't open file %s\n", in_file);
    exit(1);
  }
  
  // ファイルの末尾に位置指定子を移動
  fseek(in_fp, 0, SEEK_END);
  
  // ファイルの末尾の位置を取得。これは、ファイサイズになります。
  int32_t file_size = (int32_t)ftell(in_fp);
  
  printf("%d\n", file_size);
  
  // ファイルを閉じる
  fclose(in_fp);
}

入力ファイル。末尾に改行はありません。

HelloWorld!

出力結果。ファイルサイズが取得できています。

11

関連情報