fseek
|
ヘッダー
<stdio.h>
で定義
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* 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 )が設定され、ファイル位置は影響を受けません。
目次 |
パラメータ
| 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関数
関連項目
|
ファイル位置指示子をファイル内の特定の位置に移動する
(関数) |
|
|
ファイル位置指示子を取得する
(関数) |
|
|
現在のファイル位置指示子を返す
(関数) |
|
|
ファイル位置指示子をファイルの先頭に移動する
(関数) |
|
|
C++ documentation
for
fseek
|
|