Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
ヘッダー <stdio.h> で定義
int fseek ( FILE * stream, long offset, int origin ) ;
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

ファイルストリーム stream のファイル位置指示子を、 offset が指す値に設定します。

ストリームがバイナリモードで開かれている場合、 stream がバイナリモードで開かれている場合、新しい位置は origin SEEK_SET のときはファイル先頭から offset バイト、 origin SEEK_CUR のときは現在のファイル位置から、 origin SEEK_END のときはファイル末尾から正確に計算されます。バイナリストリームは SEEK_END をサポートする必要はなく、特に追加のnullバイトが出力される場合にはサポートされないことがあります。

ストリームがテキストモードで開かれている場合、 offset でサポートされる値はゼロ(これは任意の origin で動作する)と、同じファイルに関連付けられたストリームに対する以前の ftell 呼び出しで返された値(これは origin SEEK_SET の場合のみ動作する)のみです。

ストリームがワイド指向の場合、テキストストリームとバイナリストリームの両方の制限が適用されます( ftell の結果は SEEK_SET とゼロオフセットが許可され、 SEEK_SET SEEK_CUR からのオフセットは許可されますが、 SEEK_END からのオフセットは許可されません)。

ファイル位置指示子を変更することに加えて、 fseek ungetc の効果を取り消し、該当する場合はファイル終端ステータスをクリアします。

読み取りまたは書き込みエラーが発生した場合、ストリームのエラーインジケータ( ferror )が設定され、ファイル位置は影響を受けません。

目次

翻訳のポイント: - 「Contents」を「目次」に翻訳 - HTMLタグ、属性、リンク先は完全に保持 - C++関連の用語(Parameters、Return value、Exampleなど)は原文のまま保持 - 数値、クラス名、IDなどは変更なし - フォーマットと構造は完全に維持

パラメータ

stream - 変更するファイルストリーム
offset - 基準位置からの相対的な位置シフト文字数
origin - offset が加算される位置。以下のいずれかの値を取ります: SEEK_SET , SEEK_CUR , SEEK_END

戻り値

0 成功時は0、それ以外の場合は非ゼロ値。

注記

ワイドストリームで非終端位置にシークした後、任意の出力関数を次に呼び出すと、例えば異なる長さのマルチバイトシーケンスを出力することによって、ファイルの残りの部分が未定義状態になる可能性があります。

テキストストリームにおいて、有効な offset の値は、 0 (任意の origin に適用可能)および ftell の以前の呼び出しで返された値( SEEK_SET にのみ適用可能)のみです。

POSIXでは既存のファイル終端を超えるシークが許可されています。このシーク後に出力が行われると、ギャップからの読み取りはゼロバイトを返します。ファイルシステムでサポートされている場合、これは スパースファイル を作成します。

POSIXはまた、 fseek が最初に未書き込みデータがある場合に fflush を実行することを要求しています(ただし、シフト状態が復元されるかどうかは実装定義です)。

POSIXは、 fseek がエラー時に - 1 を返し、 errno にエラーを示す値を設定するべきであると規定しています。

Windowsでは、 _fseeki64 を使用して2 GiBを超えるファイルを操作できます。

fseek のエラーチェック付き使用例:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // double値の配列を準備
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
    // 配列をファイルに書き込み
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
    // double値を配列Bに読み込み
    double B[SIZE];
    fp = fopen("test.bin", "rb");
    // 3番目のdouble値の前にファイル位置指示子を設定
    if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
    {
        fprintf(stderr, "fseek() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 2);
        fclose(fp);
        return EXIT_FAILURE;
    }
    int ret_code = fread(B, sizeof(double), 1, fp); // 1つのdouble値を読み込み
    printf("ret_code == %d\n", ret_code);           // 読み取った値の数を表示
    printf("B[0] == %.1f\n", B[0]);                 // 1つの値を表示
    fclose(fp);
    return EXIT_SUCCESS;
}

出力例:

ret_code == 1
B[0] == 3.0

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.23.9.2 fseek関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.21.9.2 fseek関数 (p: 245)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.21.9.2 fseek関数 (p: 336-337)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.19.9.2 fseek関数 (p: 302-303)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.9.9.2 fseek関数

関連項目

ファイル位置指示子をファイル内の特定の位置に移動する
(関数)
ファイル位置指示子を取得する
(関数)
現在のファイル位置指示子を返す
(関数)
ファイル位置指示子をファイルの先頭に移動する
(関数)