名前空間
変種
操作

fseek

From cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
非書式化入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
直接入出力
書式付き出力
ファイルポジショニング
fseek
エラーハンドリング
ファイル操作
 
ヘッダー <stdio.h> で定義
int fseek( FILE* stream, long offset, int origin );
#define SEEK_SET    /* 不明 */

#define SEEK_CUR    /* 不明 */

#define SEEK_END    /* 不明 */

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

ストリームがバイナリモードで開かれている場合、新しい位置は、originSEEK_SET の場合はファイルの先頭から offset バイト、originSEEK_CUR の場合は現在のファイル位置から offset バイト、originSEEK_END の場合はファイルの末尾から offset バイトになります。バイナリストリームは、特にヌルバイトが追加で出力される場合、SEEK_END をサポートする必要はありません。

ストリームがテキストモードで開かれている場合、offset でサポートされる有効な値は、ゼロ(どの origin とも機能します)と、同じファイルに関連付けられたストリームに対して以前に行われた ftell の呼び出しによって返された値(SEEK_SETorigin のみが機能します)のみです。

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

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

読み書きエラーが発生した場合、ストリームのエラー指示子(ferror)が設定され、ファイル位置は変更されません。

目次

[編集] パラメータ

stream - 変更するファイルストリーム
offset - origin からの相対位置をシフトする文字数
origin - offset が加算される位置。次のいずれかの値を指定できます: SEEK_SET, SEEK_CUR, SEEK_END

[編集] 戻り値

成功した場合は 0、それ以外の場合はゼロ以外の値を返します。

[編集] 注意

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

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

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

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

POSIX は、fseek がエラー時に -1 を返し、エラーを示すために errno を設定することを指定しています。

Windows では、2 GiB を超えるファイルを扱うために _fseeki64 を使用できます。

[編集]

エラーチェック付き `fseek`

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    // Prepare an array of double values.
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
 
    // Write array to a file.
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
 
    // Read the double values into array B.
    double B[SIZE];
    fp = fopen("test.bin", "rb");
 
    // Set the file position indicator in front of third double value.
    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); // reads one double value
    printf("ret_code == %d\n", ret_code);           // prints the number of values read
    printf("B[0] == %.1f\n", B[0]);                 // prints one value
 
    fclose(fp);
    return EXIT_SUCCESS;
}

実行結果の例

ret_code == 1
B[0] == 3.0

[編集] 参考文献

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

[編集] 関連項目

ファイル位置指示子をファイル内の特定の場所に移動する
(関数) [編集]
ファイル位置指示子を取得する
(関数) [編集]
現在のファイル位置指示子を返す
(関数) [編集]
ファイル位置指示子をファイルの先頭に移動する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)