fseek
| ヘッダー <stdio.h> で定義 |
||
| int fseek( FILE* stream, long offset, int origin ); |
||
| #define SEEK_SET /* 不明 */ #define SEEK_CUR /* 不明 */ |
||
ファイルストリーム stream のファイル位置指示子を、offset が指す値に設定します。
ストリームがバイナリモードで開かれている場合、新しい位置は、origin が SEEK_SET の場合はファイルの先頭から offset バイト、origin が SEEK_CUR の場合は現在のファイル位置から offset バイト、origin が SEEK_END の場合はファイルの末尾から offset バイトになります。バイナリストリームは、特にヌルバイトが追加で出力される場合、SEEK_END をサポートする必要はありません。
ストリームがテキストモードで開かれている場合、offset でサポートされる有効な値は、ゼロ(どの origin とも機能します)と、同じファイルに関連付けられたストリームに対して以前に行われた ftell の呼び出しによって返された値(SEEK_SET の origin のみが機能します)のみです。
ストリームがワイド指向の場合、テキストストリームとバイナリストリームの両方の制限が適用されます(ftell の結果は SEEK_SET で許可され、ゼロオフセットは SEEK_SET および SEEK_CUR から許可されますが、SEEK_END からは許可されません)。
ファイル位置指示子の変更に加えて、fseek は ungetc の効果を取り消し、該当する場合はファイル終端ステータスをクリアします。
読み書きエラーが発生した場合、ストリームのエラー指示子(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
[編集] 関連項目
| ファイル位置指示子をファイル内の特定の場所に移動する (関数) | |
| ファイル位置指示子を取得する (関数) | |
| 現在のファイル位置指示子を返す (関数) | |
| ファイル位置指示子をファイルの先頭に移動する (関数) | |
| C++ ドキュメント for fseek
| |